我有一个使用映射插件创建的viewModel,如下所示:
var ViewModel = function (config) {
var self = this;
self.datalog = ko.observableArray([]);
// Operations
self.addData = function (x) {
self.datalog.push(x());
return x();
}
ko.mapping.fromJS(config, {}, self);
};
使用配置数据结构,如:
{
"result": {
"stuff": [
{
"foo": "bar",
"data": "Fred",
},
{
"foo": "baz",
"data": "Silvia",
}
],
"otherstuff": [
]
}
}
定期,新数据进来。我已经使用foreach绑定成功地将“stuff”内的数组映射到表中,但默认行为是当新数据进入时,它会替换旧数据。我还希望有一个不同的显示,其行为是新数据被附加到现有数组而不是替换(当前不需要删除它)。我已经尝试创建一个独立的可观察数组并使用一个函数(从html中的绑定调用addData,如下所示)将数据推送到那里(这就是我尝试显示的viewmodel)。
// the following part of the page is intended to have replace functionality,
//I am trying to use the event to push/append the data to a different array
<ol data-bind="foreach: $root.addData.bind($data, $data.result.stuff)">
<li data-bind="text: $data.foo"></li>
<li data-bind="text: $data.data"></li>
</ol>
模型绑定正确,但不起作用(没有错误)。我不确定问题是不是因为绑定它的方式而没有调用addData,或者底层方法是否错误。
想知道是否有人知道一种简单的方法来更改映射函数中绑定的默认行为以实现追加功能,而不是默认替换。
更新:我采取了一种不同的方法 - 意识到我需要在一个触发推送的事件上调用一个函数,我只是从webockets onmessage handler调用它。它从我在这里所写的内容中没有任何意义 - 因此采用不同的方法。