gpt4 book ai didi

javascript - Knockout afterRender 仅触发一次

转载 作者:行者123 更新时间:2023-12-03 04:57:22 27 4
gpt4 key购买 nike

我有这个简单的 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
});
});
}
}

此虚拟机正在应用此标记:

<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>

问题是 foreach 绑定(bind)的 afterRender 事件只被触发一次,显然是在 ko.applyBindings 之后,但 DOM 是尚未准备好,因此我们无法初始化 jQuery.ui 可拖动对象。

根据 Ko 文档,afterRender 应该在每次 observableArray(属于相应的 foreach)发生变化时触发,但它没有发生。

最终,在填充数组后,我通过在 ajax.done 中初始化可拖动来使其工作,但我觉得这不是正确的方法,尽管如此,问题仍然存在, afterRender 不会在数组更新时触发。

任何想法将不胜感激。

PS:我所说的数组显然是指 ko.observableArray

最佳答案

问题出在你的

foreach: {arr, afterRender: initPlugins($data)}

afterRender 需要一个函数作为参数,但您通过使用数据作为参数来调用该函数,请将其更改为:

foreach: {arr, afterRender: initPlugins }

afterRender方法将通过knockout调用,并带有2个参数:

插入的 DOM 元素的数组,它们所绑定(bind)的数据项

关于javascript - Knockout afterRender 仅触发一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42379894/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com