Knockout.js:更新用映射插件加载的对象

时间:2015-07-11 11:48:23

标签: javascript knockout.js

我想渲染一个包含我的服务器发送给我的对象列表的表。我现在正在这样做:

<table>
  <thead>
    <tr>
      <th>id</th>
      <th>Name</th>
      <th>Status</th>
    </tr>
  </thead>
  <tbody data-bind="foreach: services">
    <tr>
        <td data-bind="text: id"></td>
        <td data-bind="text: name"></td>
        <td data-bind="text: status"></td>
    </tr>
  </tbody>
</table>

和Knockout.js绑定部分:

var mappedData = komapping.fromJSON('{{{ services }}}');
ko.applyBindings({services: mappedData});

services是一个包含JSON数据的变量,整个页面都是用把手渲染的。 到目前为止一直很好。我能够呈现表格中收到的数据。

现在问题:我想收到一条通知,告诉我服务的状态已经改变,并更新mappedData中的相应对象。 问题是mappedData看起来非常不透明,我无法检索对象并根据其id 更新它。

帮助表示赞赏!

2 个答案:

答案 0 :(得分:0)

要获取对象,可以编写一个帮助函数,为您检索服务对象。你可以这样做(假设mappedData是一个observableArray和id observable):

function get_service_by_id(service_id){
    for(var i=0;i<mappedData().length;i++){
        if (mappedData()[i].id() === service_id){
            return mappedData()[i];
        }
    }
    return false;
}

答案 1 :(得分:0)

此时您的mappedData变量将是一个淘汰数组,其中包含一组包含敲除可观察数据的对象。

所以你要做的就是从数组中改变正确对象中的observable状态。

function updateServiceStatus(id, status) {
    var service = mappedData().filter(function(e) { return e.id() == id; });
    if (service.length) { 
        service[0].status(status); 
    }
}