繁体   English   中英

淘汰后渲染仅触发一次

[英]Knockout afterRender fires only once

我有这个简单的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绑定的afterRender事件仅被触发一次,显然是在ko.applyBindings之后,但是DOM还没有准备好,因此我们无法初始化jQuery.ui可拖动。

根据Ko文档, afterRender observableArray (属于相应的foreach)更改时, afterRender应该都会触发,但是这种情况不会发生。

最终,在填充数组之后,我通过在ajax.done初始化可拖动对象ajax.done ,但是我觉得这不是正确的方法,但是问题仍然存在, afterRender在阵列更新时不触发。

任何想法将不胜感激。

PS:按数组我显然是指ko.observableArray

问题出在你

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

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

foreach: {arr, afterRender: initPlugins }

afterRender后将使用2个参数调用afterRender方法:

插入的DOM元素的数组,将它们绑定到的数据项

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM