Knockout afterRender只发射一次

时间:2017-02-21 23:22:53

标签: javascript jquery-ui knockout.js knockout-3.0

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

1 个答案:

答案 0 :(得分:1)

问题在于你的

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

afterRender期望函数作为参数,但是您通过使用data作为参数调用函数来调用该函数,将其更改为:

foreach: {arr, afterRender: initPlugins }

afterRender方法将通过knockout调用2个参数:

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