Knockoutjs在文本更改时触发函数

时间:2013-05-20 12:06:53

标签: data-binding knockout.js

我有一个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); ,但我不知道它是否相同......

1 个答案:

答案 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);
        }
    }
};