KnockoutJs - 为什么init绑定处理程序只被调用一次?

时间:2011-10-26 15:08:52

标签: javascript jquery knockout.js twitter-bootstrap

我遇到一个问题,即第二次从服务器更新数据时没有调用init:函数。

有什么理由可能会发生这种情况吗?

我正在使用映射插件。我不明白的另一个问题是我需要以不同的方式调用映射插件函数,具体取决于这是第一次调用还是第二次调用?

JS

 function ViewMemberPopup(memberId) {

        $.get("/People/GetMemberDetails?memberId=" + memberId, function (data) {            
            viewMemberModel.model = ko.mapping.fromJS(data);            
            ko.applyBindings(viewMemberModel.model, $("#memberDetailsContainer")[0]);
        });
    }


 // binding handler
 ko.bindingHandlers.renderMemberModal = {
        init: function (element, valueAccessor, allBindingsAccessor) {
            $(element).modal("show");            
        }
    };

HTML: 我已经对绑定处理程序使用了renderMemberModal:true,不知道为什么我需要附加一个属性。我只需要调用渲染函数......

     <div class="modal fade" id="viewMemberModal" data-bind="renderMemberModal: true" style="display: none;">
        <div class="modal-header">
            <a class="close" href="#">×</a>
            <h3>
                Member Details</h3>
        </div>
        <div class="modal-body">
             <div data-bind="template: { name: 'memberDetailsTemplate' }">
            </div>
        </div>
        <div class="modal-footer">
            <a class="btnx closeModal">Close</a>
        </div>
    </div>

我正在使用bootstrap css来显示模态弹出窗口。

2 个答案:

答案 0 :(得分:2)

您通常不希望在每次更新时在同一元素上调用applyBindings。这最终可能会添加多个事件处理程序,具体取决于您使用的绑定。如果你这样做,那么你至少要在元素上调用ko.cleanNode。类似于:http://jsfiddle.net/rniemeyer/F4AzB/

我认为让template绑定(或作为模板绑定的包装器的控制流绑定)处理更新内容更容易,而不是在每次更新时调用applyBindings。

您的viewModel可以有一个observable来表示您的数据。然后,您可以使用数据的新副本更新该observable。

在这种情况下,你真正想做的是让你的自定义绑定只有一个更新函数,并确保访问主observable,以便每次调用更新函数时它都会触发。

ko.bindingHandlers.custom = {
    update: function(element, valueAccessor) {
        ko.utils.unwrapObservable(valueAccessor());  //just for subscription
        console.log("hit");
    }  
};

看起来像这样:http://jsfiddle.net/rniemeyer/dNsW8/

答案 1 :(得分:1)

在Knockoutjs网站http://knockoutjs.com/documentation/custom-bindings.html上讨论自定义绑定。

Knockout将为您使用绑定的每个DOM元素调用一次init函数。 init有两个主要用途: - 设置DOM元素的任何初始状态 - 要注册任何事件处理程序,以便,例如,当用户单击或修改DOM元素时,您可以更改关联的可观察的状态

因此,通过设计,只调用一次Init来设置绑定。它的目的是配置DOM对象,以便Update方法正常工作。