我在durandal / knockout / sammy遇到问题 - 不确定哪一个是罪魁祸首。偶尔我的var roots = ko.observableArray([]);没有绑定到UI。大部分时间它都很完美。希望SO上有人看到我不知道的东西。
VM激活:
var activate = function () {
groupsData.GetRoots().then(function (data) {
roots($.map(data, function (it) { return new groupNode.GroupNode(it); }));
//If I do a console.log(roots()); right here, the correct data shows up
});
};
的DataContext:
var getRoots = function () {
return Q.when($.getJSON(Url));
};
我的观点: 如果我反复点击刷新,其中带有“长度”的跨度将显示正确的长度MOST OF THE TIME。偶尔它会为0,并且foreach内部的UI不会显示。
<span data-bind="text: roots().length"></span>
<ul data-bind="foreach: roots">
//BLA
</ul>
答案 0 :(得分:2)
您需要return
activate
函数中的承诺,否则它将不知道承诺何时完成。
var activate = function () {
return groupsData.GetRoots().then(function (data) {
roots($.map(data, function (it) { return new groupNode.GroupNode(it); }));
});
};
如果你这样做,数据绑定将不会发生,直到承诺结束,这将消除你看到的竞争条件。