2013-07-31 4 views
2

У меня проблема с durandal/knockout/sammy - не уверен, какой из них является виновником. Иногда мои var roots = ko.observableArray ([]); не привязывается к пользовательскому интерфейсу. Большую часть времени он работает отлично. Надеюсь, кто-то на SO видит то, чего я не знаю.Нокаут наблюдаемый массив случайным образом не связывает

В.М. Активация:

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 не будет отображаться.

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

ответ

2

Вы должны return обещание в функции activate, в противном случае он не будет знать, когда обещание завершено.

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

Если вы сделаете это, привычка происходит привязка данных, пока обещание не закончит, который удалит состояние гонки вы видите.