我有这个简单的ViewModel:
export class ViewModel {
public arr : KnockoutObservableArray<Dtos>;
constructor() {
this.arr = ko.observableArray<Dtos>(null);
ko.applyBindings(this);
this.init();
}
private init() {
var self = this;
ajaxCall().done(item => {
self.arr(item.Dtos);
});
}
public initPlugins() {
jQuery(".external-events > li")
.each(function() {
if ($(this).attr("event-draggable") == "false")
return true;
jQuery(this).draggable({
zIndex: 999,
revert: true, // will cause the event to go back to its
revertDuration: 0 // original position after the drag
});
});
}
}
此vm已应用于此标记:
<ul class="external-events" data-bind="foreach: {arr, afterRender: initPlugins($data)}">
<li event-draggable="false">
<div class="bg-info">
<span data-bind="text: Name"></span>
</div>
<ul class="external-events" data-bind="foreach: moreStuff">
<li>
<div class="bg-info">
<span data-bind="text: Name"></span>
</div>
</li>
</ul>
</li>
</ul>
问题是afterRender
绑定的foreach
事件只被触发一次,显然是在ko.applyBindings
之后但是DOM还没有准备好所以我们无法初始化jQuery.ui
可拖动。
根据Ko文档,afterRender
每次observableArray
(属于相应的foreach)发生变化时都会触发,但它没有发生。
最终我通过在填充数组后初始化ajax.done
中的draggable来实现它,但我觉得这不是正确的方法,但问题仍然存在,{ {1}}没有触发阵列更新。
非常感谢任何想法。
PS:通过数组我显然是afterRender
答案 0 :(得分:1)
问题在于你的
foreach: {arr, afterRender: initPlugins($data)}
afterRender
期望函数作为参数,但是您通过使用data作为参数调用函数来调用该函数,将其更改为:
foreach: {arr, afterRender: initPlugins }
afterRender
方法将通过knockout调用2个参数:
插入的DOM元素的数组,它们被绑定的数据项