2013-07-31 64 views
2

我遇到了durandal/knockout/sammy的问题 - 不知道哪一个是罪魁祸首。偶尔我的var roots = ko.observableArray([]);没有被绑定到UI。大多数时候它完美地工作。希望有人能看到我不喜欢的东西。Knockout observable array随机不绑定

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的时间。偶尔它会是0,并且foreach里面的UI不会显示。

<span data-bind="text: roots().length"></span> 
    <ul data-bind="foreach: roots"> 
     //BLA 
    </ul> 

回答

2

您需要returnactivate功能的承诺,否则当承诺已完成也不会知道。

var activate = function() { 
    return groupsData.GetRoots().then(function (data) { 
     roots($.map(data, function (it) { return new groupNode.GroupNode(it); })); 
    }); 
}; 

如果你这样做,不会发生数据绑定,直到承诺已经完成,这将删除您所看到的竞争条件。