Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/418.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么init绑定处理程序只被调用一次?_Javascript_Jquery_Knockout.js_Twitter Bootstrap - Fatal编程技术网

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

Javascript 为什么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) {

我有一个问题,在第二次从服务器更新数据时没有调用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显示模式弹出窗口。

在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在从引导程序交换后也无法正常工作。谢谢,这对我帮助很大。我现在有了一个有效的解决方案!