From 35905ffebe99f4b2873aef7ad718458f10a9e526 Mon Sep 17 00:00:00 2001 From: Jinjiang Date: Tue, 26 Apr 2016 12:19:51 +0800 Subject: [PATCH 1/2] fixed Vue.delete(vm, key) bug --- src/util/lang.js | 4 ++++ test/unit/specs/observer/observer_spec.js | 19 +++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/src/util/lang.js b/src/util/lang.js index e53e9869434..29e450fa5a2 100644 --- a/src/util/lang.js +++ b/src/util/lang.js @@ -50,6 +50,10 @@ export function del (obj, key) { delete obj[key] var ob = obj.__ob__ if (!ob) { + if (obj._isVue) { + delete obj._data[key] + obj._digest() + } return } ob.dep.notify() diff --git a/test/unit/specs/observer/observer_spec.js b/test/unit/specs/observer/observer_spec.js index b4ed2f9b6fb..2a2eab06eea 100644 --- a/test/unit/specs/observer/observer_spec.js +++ b/test/unit/specs/observer/observer_spec.js @@ -286,6 +286,25 @@ describe('Observer', function () { expect(dep3.notify.calls.count()).toBe(2) }) + it('observing set/delete in Vm object', function (done) { + var el = document.createElement('div') + var vm = new Vue({ + el: el, + template: '
{{a}}
', + data: { a: 1 } + }) + expect(el.innerHTML).toBe('
1
') + Vue.set(vm, 'a', 2) + Vue.nextTick(() => { + expect(el.innerHTML).toBe('
2
') + Vue.delete(vm, 'a') + Vue.nextTick(() => { + expect(el.innerHTML).toBe('
') + done() + }) + }) + }) + it('observing array mutation', function () { var arr = [] var ob = observe(arr) From 62b5b9bbfacd7315466f74d989fc22f424ada3d4 Mon Sep 17 00:00:00 2001 From: Jinjiang Date: Tue, 26 Apr 2016 12:49:34 +0800 Subject: [PATCH 2/2] rollback to es5 syntax in test case --- test/unit/specs/observer/observer_spec.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/unit/specs/observer/observer_spec.js b/test/unit/specs/observer/observer_spec.js index 2a2eab06eea..ea9ade50aae 100644 --- a/test/unit/specs/observer/observer_spec.js +++ b/test/unit/specs/observer/observer_spec.js @@ -295,10 +295,10 @@ describe('Observer', function () { }) expect(el.innerHTML).toBe('
1
') Vue.set(vm, 'a', 2) - Vue.nextTick(() => { + Vue.nextTick(function () { expect(el.innerHTML).toBe('
2
') Vue.delete(vm, 'a') - Vue.nextTick(() => { + Vue.nextTick(function () { expect(el.innerHTML).toBe('
') done() })