gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 13:27:43 25 4
gpt4 key购买 nike

我有一个问题,即 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 作为绑定(bind)处理程序,不确定为什么我需要附加一个属性。我只需要调用渲染函数...

     <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 来显示模态弹出窗口。

最佳答案

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

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

p>

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

在那种情况下,您真正​​想要做的是让您的自定义绑定(bind)只有一个更新函数,并确保访问主要的可观察对象,以便它在您每次调用更新函数时触发。

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

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

关于javascript - KnockoutJs - 为什么 init 绑定(bind)处理程序只被调用一次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7904716/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com