我有一个包含以下内容的虚拟机:
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;?
答案 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);
},