data-binding
  • knockout.js
  • 2013-05-20 66 views 0 likes 
    0

    我有一个视图模型每隔几秒由json请求填充。当文本发生变化时,Knockoutjs触发函数

    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:[{},{}]},...]

    因此, mapping.fromJS(data),返回[] !! 只好用 ko.mapping.fromJS(data, {}, viewModel); ,但我不知道这是否是一样的...

    回答

    1

    你应该使用一个映射,当你第一次创建您的视图模型。通过映射,您可以指定将哪个属性用作唯一键,从而防止不必要地移除/插入数组中的对象。

    请阅读一节使用“钥匙”在ko.mapping文档唯一标识对象:http://knockoutjs.com/documentation/plugins-mapping.html

    如果你有数组比根更深层次更复杂的对象,你需要指定一个映射在您想要指定唯一密钥的所有地方。下面是一个例子(用的jsfiddle这里样本数据: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); 
         } 
        } 
    }; 
    
    +0

    什么嵌套的对象?似乎没有在那里工作... – AntouanK

    +0

    我用嵌套映射的例子更新了我的答案,并通过jsfiddle链接到了一个工作示例 – Christoffer

    相关问题