Javascript 自定义绑定未触发更新

Javascript 自定义绑定未触发更新,javascript,jquery,jquery-mobile,knockout.js,custom-binding,Javascript,Jquery,Jquery Mobile,Knockout.js,Custom Binding,我使用的系统是使用Knockout.js和Jquery移动用户界面的组合。我遇到的一个问题是让Jquery Mobile应用于具有knockout:if绑定的元素。我们使用的最初解决方案是在调用ko.applyBindings和ko.valuehassmutated时在页面循环中触发事件,然后在事件处理程序中调用以下 $(element).find('div[data-onthemovecollapsible="true"]:not(div[data-role="collapsible"])')

我使用的系统是使用Knockout.js和Jquery移动用户界面的组合。我遇到的一个问题是让Jquery Mobile应用于具有
knockout:if
绑定的元素。我们使用的最初解决方案是在调用
ko.applyBindings
ko.valuehassmutated
时在页面循环中触发事件,然后在事件处理程序中调用以下

$(element).find('div[data-onthemovecollapsible="true"]:not(div[data-role="collapsible"])').attr("data-role", "collapsible");
$(element).collapsibleset().collapsibleset("refresh");
问题是有时会被多次调用,有时会有人忘记触发所需的事件,并且会一次又一次地产生相同的错误,因此业务部门决定使用以下逻辑将此机制移动到自定义绑定:如果元素被绑定(变为可见或以其他方式在页面上结束)然后应用JQuery移动用户界面<自定义绑定的code>init相当于
ko.applyBindings
update
相当于
ko.valuehassmutated
。 当列表“出现”在页面上时,它可以正常工作,但是当使用分页或筛选时,模型没有被“重新绑定”,只有viewModel数组被更改,并且调用了
ko.valueHasMutated
。我刚刚发现,当触发值发生变化时,
update
不会被调用。我做了一些阅读,这似乎是一个已知的问题,但没有一个解决方案似乎在我的情况下工作

ko.bindingHandlers.expandableListJQM = {
    init: function (element, valueAccessor) {
        $(element).find('div[data-onthemovecollapsible="true"]:not(div[data-role="collapsible"])').attr("data-role", "collapsible");
        $(element).collapsibleset().collapsibleset("refresh");
        var val = ko.utils.unwrapObservable(valueAccessor());
        if (val!= undefined) {
             valueAccessor().subscribe(function (element, valueAccessor) {
                $(element).find('div[data-onthemovecollapsible="true"]:not(div[data-role="collapsible"])').attr("data-role", "collapsible");
                $(element).collapsibleset().collapsibleset("refresh");
            });
        }
    },

    update: function (element, valueAccessor) {
        $(element).find('div[data-onthemovecollapsible="true"]:not(div[data-role="collapsible"])').attr("data-role", "collapsible");
        $(element).collapsibleset().collapsibleset("refresh");
    }
};
即使我订阅了
valueAccessor()
比如
函数(元素,valueAccessor){…
它对我来说也没有多大用处,因为作为
element
传递的变量是空数组,不是有用的东西。
我可以通过使用JQuery选择器开始应用
.collapsableset().collapsableset
,因为我知道ID列表中有什么,但这并不是一个合适的解决方案,我们最好还是放弃以前的hack


我如何在
ko.valuehassmutated
上创建knockout.js自定义绑定
update
fire并传递正确的参数?

目前我正在使用这个解决方案,因为我知道有人会提出它。但这只是一个黑客行为,我更喜欢别人的“正确”解决方案

ko.bindingHandlers.expandableListJQM = {
    init: function (element, valueAccessor) {
        $(element).find('div[data-onthemovecollapsible="true"]:not(div[data-role="collapsible"])').attr("data-role", "collapsible");
        $(element).collapsibleset().collapsibleset("refresh");
        var element =  $(element);
        var val = ko.utils.unwrapObservable(valueAccessor());
        if (val!= undefined) {
             valueAccessor().subscribe(function() {
                $(element).find('div[data-onthemovecollapsible="true"]:not(div[data-role="collapsible"])').attr("data-role", "collapsible");
                $(element).collapsibleset().collapsibleset("refresh");
            });
        }
    },

    update: function (element, valueAccessor) {
        $(element).find('div[data-onthemovecollapsible="true"]:not(div[data-role="collapsible"])').attr("data-role", "collapsible");
        $(element).collapsibleset().collapsibleset("refresh");
    }
};

我不太明白你在做什么,也不知道问题是什么。你能不能把这个问题一五一十地重现一下,我们也许能帮你找出问题所在,或者找到一种使它正常工作的方法?@PWKad这不是一个bug请求,更新中的代码工作正常,但它的工作方式是错误的。这是因为自定义绑定有
init
update
,第一个用于初始绑定,另一个用于后续的值更改(至少我是这么理解的)。更新中的代码是解决方法-我正在寻找合适的解决方案(这将在
valueHasMutated
上进行,例如模型更新将调用自定义绑定
update
).你似乎是击倒赛的专家。如果我在这里遗漏了什么,请告诉我。谢谢。