将项添加到ObservableArray()并等到它被添加?

时间:2016-04-08 03:10:53

标签: javascript jquery html knockout.js kendo-ui

我有一个包含以下内容的虚拟机:

var myArray = ko.observableArray(),
....
addItem = function(data) {
    myArray.unshift(data);
},

在我的视图中,我有一些与之绑定的HTML:

   <div data-bind="foreach: myArray">
   ....<label data-bind:="attr: { id: 'myLabel_' + name }"></Label>
   </div>

一切都很好 - 当我调用addItem函数时,一个项被添加到我的obserableArray()中,而Knockout会添加相应的HTML。

我现在面临的问题是,我尝试使用更复杂的控件(如Kendo网格),而不仅仅使用纯HTML。当我调用newItem时,我需要调用Javascript方法来启动Grid。但是,如果我这样做,它就不起作用(我假设因为当Knndoout试图做它需要做的事情时,Knockout没有完成它做的事情)。

以下不起作用:

var myArray = ko.observableArray(),
....
addItem = function(data) {
    myArray.unshift(data);
    var test = $('#myLabel_nameOne');
    // Kendo specific code to setup test
},

如果我从控制台运行相同的Kendo特定代码 - 它运行良好。如果我使用setInterval,那也可以。

我知道有一个&after-afterRender&#39;我可以浏览整个模板 - 但我只是想知道在将一个项目添加到observableArray之后UI何时完成。

说什么是正确的方式&#39;等到真正添加之后,再去做其他事情?&#39;或者&#39;添加此功能,当用户界面准备好后,请为我调用此功能&#39;?

1 个答案:

答案 0 :(得分:1)

我遇到了Knockout以外的框架的异步问题,并且通常使用jQuery和Deferred()对象编写包装器来解决这些问题。

阅读Knockout文档后,您只需使用订阅功能。

var myArray = ko.observableArray()
myArray.subscribe(function(data) {
  var test = $('#myLabel' + data.name);
  // Kendo specific code to setup test
});
  ....
addItem = function(data) {
  myArray.unshift(data);
},