【发布时间】:2016-09-30 06:15:14
【问题描述】:
我想在一个名为ObservableList 的自定义类上使用Proxy,该类包含Array。由于Proxy只有ES6之后才有,不知道有没有替代的实现方式。
我的要求是一旦ObservableList 发生变化,就让观察者得到更新(而不是被注意到),这样观察者总是与带有某种过滤或映射方法的可观察者保持一致。
var activities = new ObservableList(['reading', 'swimming']);
var sAct = activities.filter(function(v) {
return v[0] === 's';
});
// expect sAct.list to be ['swimming']
var meAct = activities.map(function(v) {
return 'I am ' + v;
});
// expect meAct.list to be ['I am reading', 'I am swimming']
activities.list.push('smiling');
console.log(sAct.list, meAct.list);
// expect sAct.list to be ['swimming', 'smiling']
// expect meAct.list to be ['I am reading', 'I am swimming', 'I am smiling']
activities.list[1] = 'snoopying';
console.log(sAct.list, meAct.list);
// expect sAct.list to be ['swimming', 'snoopying']
// expect meAct.list to be ['I am reading', 'I am snoopying', 'I am smiling']
我的 Proxy 实现可在 https://jsfiddle.net/ovilia/tLmbptr0/3/ 获得
【问题讨论】:
-
是
activities.push还是activities.list.push? -
你的可观察列表需要在哪些使用场景下工作?到目前为止,您只展示了调用
push方法并分配给已经存在的索引。你还需要什么?请具体。 -
@Bergi
activities.list.push。我需要观看push、shift、splice等所有数组操作。 -
如果仅此而已,您甚至不需要代理 - 只需继承
Array并使用调用 super 然后通知观察者的更新方法覆盖每个更新方法。 -
@Bergi 数组索引器和
length很难用这种方法打补丁。 @LiuJi-Jim 的答案在许多框架中被广泛采用。这令人沮丧,但不知何故有效。或者脏检查,比如 Angular,无聊又丑陋……
标签: javascript ecmascript-6 observer-pattern es6-proxy