我有一个json请求每隔几秒填充一次的viewmodel。
viewModel = ko.mapping.fromJS([]);
...
getJSON(){
...
ko.mapping.fromJS(data,viewModel);
}
然后我在HTML中有一些文本绑定。
<div id="mainContainer" data-bind='foreach: viewModel'>
<span data-bind='text: name()'></span>
<!-- ko foreach: items() -->
<span data-bind='text: value()'></span>
<!-- /ko -->
</div>
通常,这些值每1-2分钟更改一次。 但是每次读取JSON时,模型都会“更新”并认为所有值都是“新的”。所以我不能使用'更新'。 假设我想在这个值真正发生变化时做点什么。 例如,绿色边框持续2秒。有没有办法在每次更新模型时评估值,如果旧值与新值不同,是否检查每个值?
另一个问题是我得到的数据是一个包含对象的数组。 [{name:'name1',items:[{},{}]},{name:'name2',items:[{},{}]},...]
所以,ko.mapping.fromJS(data),返回[] !!
不得不用
ko.mapping.fromJS(data, {}, viewModel);
,但我不知道它是否相同......
答案 0 :(得分:1)
首次创建viewModel时应使用映射。该映射允许您指定要用作唯一键的属性,从而防止在数组中不必要地删除/插入对象。
请阅读ko.mapping文档中使用“keys”的唯一识别对象的部分:http://knockoutjs.com/documentation/plugins-mapping.html
如果您有更复杂的对象,其阵列深于根级别,则需要在要指定唯一键的所有位置指定映射。这是一个例子(jsfiddle with sample data here http://jsfiddle.net/9LfmX/)
var rootMapping = {
'items': {
create: function(options) {
return ko.mapping.fromJS(options.data, subitemMapping);
},
key: function(data) {
return ko.utils.unwrapObservable(data.id);
}
}
};
var subitemMapping = {
'subdata': {
key: function(data) {
return ko.utils.unwrapObservable(data.subId);
}
}
};