【问题标题】:Observer doesn't detect array push观察者没有检测到数组推送
【发布时间】:2014-05-20 17:20:10
【问题描述】:

随着我越来越多地发现这个库,我被困在这一件事上。

我有这个 staticData 数组:

staticData = {
    buildingsQueue : [
        { current: false, building : 14, queueID : 1, elapsed : 27, finish : 46 },
        { current: false, building : 4, queueID : 2, elapsed : 0, finish : 25 }
    ]
}

还有这个 Ractive 实例:

var townController = {
    init : function () {
        townTPL = new Ractive({
            el : 'pageContainer',
            append : true,
            template : templates.town,
            data : {
                staticUrl : staticData.url,
                queue : staticData.village.buildingsQueue
            }
        });

        townTPL.observe('queue.*',function(newValue,oldValue,keypath){
            console.log('changed::'+keypath);
        });

    }

我的buildingQueue 将一次处理一个,并且townController 会将current 键设置为true,因此我决定在queue.* 之后创建一个观察者Rich's example

var ractive = new Ractive({
  el: myContainer,
  template: myTemplate,
  data: {
    people: [
      {name: 'Rich Harris'},
      {name: 'Marty Nelson'}
    ]
  }
});

ractive.observe('people.*', function(newValue, oldValue, keypath) {

});

var people = ractive.get('people');
people.push({name: 'Jason Brown'});
//newValue will equal 3, and the keypath will be people.length

问题是 buildingQueue 会随着时间而改变,像下面这样推送数据不会触发观察者回调:

var list = TownTPL.get('queue');
list.push({ current: true, building : 1, queueID : 4, elapsed : 0, finish : 36 })
// OR   
staticData.buildingsQueue.push({ current: true, building : 1, queueID : 4, elapsed : 0, finish : 36 });

观察者并没有像 Rich 的文档中所说的那样触发它的示例。我的逻辑是观察者只在启动时处理数组中的数组项,但我很确定这不是真的,它应该与动态数组一起工作,所以,请赐教。

注意 我正在从 init 函数(例如 Javascript 控制台或其他 javascript 对象)外部触发推送事件。

固定问题 我已经将插件更新到边缘版本,仍然是 0.4.0,就像我使用的那个一样,但是,这个是两天前发布的。感谢 Rich 和 Marty,无论您在这些提交中做了什么。

【问题讨论】:

  • jsfiddle.net/Dz4RZ 似乎正在工作(边缘版本)。让我们弄清楚与您的使用有何不同。另外,你用的是什么版本?
  • @martypdx jsfiddle.net/Dz4RZ/1 ,我正在使用 0.4.0 ,似乎使用子数组不起作用。还是我在那里做错了什么。
  • 你使用了错误的变量,应该是staticData.logjsfiddle.net/Dz4RZ/3 。也许这就是observe 吞下错误的问题?尝试添加 console.log 以查看它是否正在触发。
  • 啊等等,4.0 观察数组的工作方式有点不同,添加时只有一个 length 键路径。见jsfiddle.net/Dz4RZ/4。它仍然会触发,但仅用于长度更改,而不是物品本身(如果我没记错的话,这可能是一个错误)。我们删除了长度作为 4.1 的 queue.* 的匹配项,但仍然可以通过 queue.length 显式观察到。
  • 我更新了边缘版本,显然我的版本是在一周前发布的,或者类似的,而这个版本的 4.0 是两天前发布的。我没有更改代码中的任何内容,但可以使用边缘版本。谢谢。

标签: javascript ractivejs


【解决方案1】:

已通过更新到边缘版本修复。

【讨论】:

    猜你喜欢
    • 2018-01-03
    • 1970-01-01
    • 2016-10-11
    • 2014-01-28
    • 1970-01-01
    • 2014-04-13
    • 2017-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多