Skip to content

Commit f9c4aaa

Browse files
author
RubyLouvre
committed
fix Proxy问题
1 parent 856d206 commit f9c4aaa

File tree

10 files changed

+175
-9061
lines changed

10 files changed

+175
-9061
lines changed

buildIE9.js

+7-8
Original file line numberDiff line numberDiff line change
@@ -51,14 +51,13 @@ module.exports = rollup.rollup({
5151
var feather = heredoc(function() {
5252
/*
5353
https://github.com/RubyLouvre/avalon/tree/2.2.1
54-
添加计算属性
55-
添加事务
56-
内部所有类使用es6重写
57-
修正使用requirejs加载avalon2.2.0,返回空对象的BUG
58-
优化组件延迟定义的逻辑
59-
fromString进行性能优化
60-
fix 空字符串不生成节点的BUG
61-
确保onReady的执行时机,多个ms-controller套嵌,先执行里面的,再执行外面的
54+
fix ms-controller BUG, 上下VM相同时,不会进行合并
55+
ms-for不再生成代理VM
56+
为监听数组添加toJSON方法
57+
IE7的checked属性应该使用defaultChecked来设置
58+
对旧版firefox的children进行polyfill
59+
修正ms-if,ms-text同在一个元素时出BUG的情况
60+
修正ms-visible,ms-effect同在一个元素时出BUG的情况
6261
*/
6362
})
6463
var now = new Date

dist/avalon.js

+37-61
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*!
2-
built in 2016-12-8:20:35 version 2.2.2 by 司徒正美
2+
built in 2016-12-9:0:9 version 2.2.2 by 司徒正美
33
https://github.com/RubyLouvre/avalon/tree/2.2.1
44
55
@@ -4298,6 +4298,22 @@ IE7的checked属性应该使用defaultChecked来设置
42984298

42994299
platform.createProxy = createProxy;
43004300

4301+
platform.itemFactory = function itemFactory(before, after) {
4302+
var keyMap = before.$model;
4303+
var core = new IProxy(keyMap);
4304+
var state = avalon.shadowCopy(core.$accessors, before.$accessors); //防止互相污染
4305+
var data = after.data;
4306+
//core是包含系统属性的对象
4307+
//keyMap是不包含系统属性的对象, keys
4308+
for (var key in data) {
4309+
var val = keyMap[key] = core[key] = data[key];
4310+
state[key] = createAccessor(key, val);
4311+
}
4312+
var keys = Object.keys(keyMap);
4313+
var vm = platform.createViewModel(core, state, core);
4314+
platform.afterCreate(vm, core, keys);
4315+
return vm;
4316+
};
43014317
function createAccessor(key, val, isComputed) {
43024318
var mutation = null;
43034319
var Accessor = isComputed ? Computed : Mutation;
@@ -5504,20 +5520,6 @@ IE7的checked属性应该使用defaultChecked来设置
55045520
this.node.forDir = this; //暴露给component/index.js中的resetParentChildren方法使用
55055521
this.fragment = ['<div>', this.fragment, '<!--', this.signature, '--></div>'].join('');
55065522
this.cache = {};
5507-
var me = this;
5508-
this.innerAction = {
5509-
uuid: Math.random(),
5510-
schedule: function schedule() {
5511-
5512-
me.fragments && me.fragments.forEach(function (el) {
5513-
updateItemVm(el.vm, me.vm);
5514-
5515-
el.innerRender.update();
5516-
});
5517-
this._isScheduled = false;
5518-
}
5519-
};
5520-
collectInFor(this);
55215523
},
55225524
diff: function diff(newVal, oldVal) {
55235525
/* istanbul ignore if */
@@ -5632,7 +5634,6 @@ IE7的checked属性应该使用defaultChecked来设置
56325634
fragment.index = index; // 相当于 c.index
56335635
fragment.vm[instance.keyName] = instance.isArray ? index : fragment.key;
56345636
saveInCache(newCache, fragment);
5635-
fragment.innerRender.update();
56365637
} else {
56375638
//如果找不到就进行模糊搜索
56385639
fuzzy.push(c);
@@ -5649,12 +5650,12 @@ IE7的checked属性应该使用defaultChecked来设置
56495650

56505651
fragment.vm[instance.valName] = val;
56515652
fragment.vm[instance.keyName] = instance.isArray ? index : fragment.key;
5652-
fragment.innerRender.update();
56535653
delete fragment._dispose;
56545654
} else {
5655-
//new VFragment([], k, value, i++
5656-
fragment = new VFragment([], c.key, c.val, c.index);
5657-
fragment = FragmentDecorator(fragment, instance, c.index);
5655+
5656+
c = new VFragment([], c.key, c.val, c.index);
5657+
5658+
fragment = FragmentDecorator(c, instance, c.index);
56585659
list.push(fragment);
56595660
}
56605661
saveInCache(newCache, fragment);
@@ -5667,27 +5668,6 @@ IE7的checked属性应该使用defaultChecked来设置
56675668
instance.cache = newCache;
56685669
}
56695670

5670-
function updateItemVm(vm, top) {
5671-
for (var i in top) {
5672-
if (top.hasOwnProperty(i)) {
5673-
vm[i] = top[i];
5674-
}
5675-
}
5676-
}
5677-
5678-
function collectInFor(instance) {
5679-
var top = instance.vm;
5680-
5681-
if (!top) return;
5682-
var deps = top.$mutations || {};
5683-
for (var i in top) {
5684-
try {
5685-
var created = top[i];
5686-
avalon.Array.ensure(deps[i].observers, instance.innerAction);
5687-
} catch (e) {}
5688-
}
5689-
}
5690-
56915671
function updateList(instance) {
56925672
var before = instance.begin.dom;
56935673
var parent = before.parentNode;
@@ -5721,32 +5701,28 @@ IE7的checked属性应该使用defaultChecked来设置
57215701
* @returns { key, val, index, oldIndex, this, dom, split, vm}
57225702
*/
57235703
function FragmentDecorator(fragment, instance, index) {
5724-
var top = instance.vm,
5725-
data = {};
5726-
updateItemVm(data, top);
5727-
5728-
data.$events = {};
5704+
var data = {};
57295705
data[instance.keyName] = instance.isArray ? index : fragment.key;
57305706
data[instance.valName] = fragment.val;
57315707
if (instance.asName) {
57325708
data[instance.asName] = instance.value;
57335709
}
5734-
5735-
// if(instance.isArray){
5736-
// vm.$watch(instance.valName, function(a){
5737-
// if(instance.value && instance.value.set){
5738-
// instance.value.set(vm[instance.keyName], a)
5739-
// }
5740-
// })
5741-
// }else{
5742-
// vm.$watch(instance.valName, function(a){
5743-
// instance.value[fragment.key] = a
5744-
// })
5745-
// }
5746-
5747-
fragment.vm = data;
5710+
var vm = fragment.vm = platform.itemFactory(instance.vm, {
5711+
data: data
5712+
});
5713+
if (instance.isArray) {
5714+
vm.$watch(instance.valName, function (a) {
5715+
if (instance.value && instance.value.set) {
5716+
instance.value.set(vm[instance.keyName], a);
5717+
}
5718+
});
5719+
} else {
5720+
vm.$watch(instance.valName, function (a) {
5721+
instance.value[fragment.key] = a;
5722+
});
5723+
}
57485724
fragment.index = index;
5749-
data.$render = fragment.innerRender = avalon.scan(instance.fragment, data, function () {
5725+
fragment.innerRender = avalon.scan(instance.fragment, vm, function () {
57505726
var oldRoot = this.root;
57515727
ap.push.apply(fragment.children, oldRoot.children);
57525728
this.root = fragment;

0 commit comments

Comments
 (0)