【发布时间】: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.log。 jsfiddle.net/Dz4RZ/3 。也许这就是observe吞下错误的问题?尝试添加console.log以查看它是否正在触发。 -
啊等等,
4.0观察数组的工作方式有点不同,添加时只有一个length键路径。见jsfiddle.net/Dz4RZ/4。它仍然会触发,但仅用于长度更改,而不是物品本身(如果我没记错的话,这可能是一个错误)。我们删除了长度作为 4.1 的queue.*的匹配项,但仍然可以通过queue.length显式观察到。 -
我更新了边缘版本,显然我的版本是在一周前发布的,或者类似的,而这个版本的 4.0 是两天前发布的。我没有更改代码中的任何内容,但可以使用边缘版本。谢谢。
标签: javascript ractivejs