Javascript 为什么init绑定处理程序只被调用一次?
我有一个问题,在第二次从服务器更新数据时没有调用init:函数 有什么原因会发生这种情况吗 我正在使用映射插件。另一个我不明白的问题是,我是否需要根据这是第一次调用还是第二次调用,以不同的方式调用映射插件函数 JSJavascript 为什么init绑定处理程序只被调用一次?,javascript,jquery,knockout.js,twitter-bootstrap,Javascript,Jquery,Knockout.js,Twitter Bootstrap,我有一个问题,在第二次从服务器更新数据时没有调用init:函数 有什么原因会发生这种情况吗 我正在使用映射插件。另一个我不明白的问题是,我是否需要根据这是第一次调用还是第二次调用,以不同的方式调用映射插件函数 JS function ViewMemberPopup(memberId) { $.get("/People/GetMemberDetails?memberId=" + memberId, function (data) {
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显示模式弹出窗口。在Knockoutjs站点上讨论自定义绑定
对于使用绑定的每个DOM元素,Knockout将调用init函数一次。init有两个主要用途:
-为DOM元素设置任何初始状态
-注册任何事件处理程序,例如,当用户单击或修改DOM元素时,您可以更改关联的可观察对象的状态
因此,根据设计,Init只被调用一次以设置绑定。其目的是配置DOM对象,以使更新方法正确工作。您通常不希望在每次更新时对同一元素继续调用applyBindings。这最终可能会添加多个事件处理程序,具体取决于您使用的绑定。如果要这样做,那么您至少需要调用元素上的
ko.cleanNode
。比如:
我认为让模板
绑定(或作为模板绑定包装的控制流绑定)处理内容更新比在每次更新时调用applyBindings更容易
您的viewModel可以有一个可观察对象来表示您的数据。然后,您可以使用数据的新副本更新该可观察对象
在这种情况下,您真正想要做的是让您的自定义绑定只有一个update函数,并确保访问主可观察对象,以便它在每次调用update函数时触发
ko.bindingHandlers.custom = {
update: function(element, valueAccessor) {
ko.utils.unwrapObservable(valueAccessor()); //just for subscription
console.log("hit");
}
};
看起来是这样的:只是尝试浏览并理解示例。ko.mapping.fromJS(dataFromServer,null,viewModel.myData())-为什么是3个参数,我认为只需要2个?这上面有文档吗?ko.mapping.fromJS可以接受三个参数。第一个是数据,第二个是映射选项,第三个是要更新的对象。如果您正在处理要更新的已映射对象,则可以将其作为第二个参数传递,因为它不再需要映射选项,并且会识别您传递的是已映射对象而不是映射选项。您可以在JSFIDLE中重现您的问题吗?您使用的是什么版本的KO?在1.3 beta版(或github当前版本)中试用,$数据在任何地方都可用,而不仅仅是在jQuery模板中。我已经尽了最大努力,但恐怕这不是我的日子,甚至jQuery ui在从引导程序交换后也无法正常工作。谢谢,这对我帮助很大。我现在有了一个有效的解决方案!