1

我有一个问题,即第二次从服务器更新数据时没有调用 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>

我正在使用引导 css 来显示模式弹出窗口。

4

2 回答 2

2

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

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

你的 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/

于 2011-10-26T16:02:08.593 回答
1

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

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

因此,按照设计,仅调用一次 Init 来设置绑定。其目的是配置 DOM 对象,以便 Update 方法正常工作。

于 2011-10-26T16:02:06.293 回答