我遇到一个问题,即第二次从服务器更新数据时没有调用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来显示模态弹出窗口。
答案 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");
}
};
答案 1 :(得分:1)
在Knockoutjs网站http://knockoutjs.com/documentation/custom-bindings.html上讨论自定义绑定。
Knockout将为您使用绑定的每个DOM元素调用一次init函数。 init有两个主要用途: - 设置DOM元素的任何初始状态 - 要注册任何事件处理程序,以便,例如,当用户单击或修改DOM元素时,您可以更改关联的可观察的状态
因此,通过设计,只调用一次Init来设置绑定。它的目的是配置DOM对象,以便Update方法正常工作。