我对淘汰赛和使用可观察者的一些问题相对较新。这是我正在使用的一些淘汰赛的配对版本:
var model;
function viewModel(data) {
var self = this;
self.favesData = ko.observableArray(data.User.Favorites);
self.splitRows = ko.computed(function () {
var i = 0;
var faveRows = [];
var size = 2;
while (i < self.favesData().length) {
faveRows.push(self.favesData().slice(i, i += size));
}
return faveRows;
});
self.refresh = (function (data) {
self.favesData(data.User.Favorites);
});
}
function onComplete(result) {
if (!model) {
model = new viewModel(result);
ko.applyBindings(new viewModel(result));
} else {
model.refresh(result);
}
}
<table class="table-main link" data-bind="foreach: splitRows">
<tr data-bind="foreach: $data">
<td>
<div class="link">
<a href="#" data-bind="text: $data.Name">
</a>
</div>
</td>
</tr>
</table>
我使用ajax GET,它调用onComplete。数据很好,一切都在初始负载上很好。然后我用新输入调用相同的ajax函数,它开始正常工作 - 返回的数据不同,刷新更新favesData和splitRows重新计算,但UI显示永远不会改变。 splitRows在重新计算时不应更新绑定吗? 我很困惑如何将新数据传递给favesData可以更新监视它的计算observable,但计算的observable不会更新UI。
答案 0 :(得分:3)
在你的onComplete方法中,你没有将Markup绑定到模型,而是绑定到viewModel的新实例,它应该如下所示。
ko.applyBindings(model);
在UI未使用的模型上调用刷新
答案 1 :(得分:0)
尝试clearing the array and pushing the new items in,例如;
self.favesData.removeAll();
data.User.Favorites.each(function(fav) { self.favesData.push(fav); });
看看是否对其进行排序。我倾向于使用官方knockout mapping plugin,它可以很好地处理服务器中的'knockouting-up'模型并刷新它们。
通常情况下,您最终会通过在viewmodel
中执行此类操作来刷新self.refresh = function(data) {
ko.mapping.fromJS(data, {}, self);
}
重新绑定整个模型。