簡體   English   中英

自定義綁定不會觸發更新

[英]custom binding is not firing update

我正在使用使用Knockout.js和Jquery Mobile UI組合的系統。 我遇到的問題之一是讓Jquery Mobile應用於具有knockout :if綁定的元素。 我們使用的最初解決方案是在調用ko.applyBindingsko.valueHasMutated頁面周期觸發事件中,然后在事件處理程序中調用以下內容

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

問題在於,這有時會被調用很多次,或者有時有人會忘記觸發所需的事件,並一遍又一遍地產生相同的錯誤,因此企業決定采用以下邏輯將該機制移至自定義綁定:如果元素已綁定(變得可見或其他方法最終顯示在頁面上),然后應用JQuery移動用戶界面。 自定義綁定的init等同於ko.applyBindingsupdate等同於ko.valueHasMutated 當列表“出現”在頁面上時,它工作正常,但是當使用分頁或過濾時,模型未“重新綁定”,僅更改了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");
    }
};

即使我像示例function (element, valueAccessor) {... valueAccessor()一樣訂閱valueAccessor() function (element, valueAccessor) {...對我來說也沒有多大用處,因為作為element傳遞的變量是空數組,沒有什么用處。
我可以通過使用JQuery選擇器來開始應用.collapsibleset().collapsibleset ,因為我知道ID列表具有什么,但是這感覺不是一個合適的解決方案,我們最好還是保留以前的技巧。

如何通過傳遞適當的參數在ko.valueHasMutated使基因敲除ko.valueHasMutated自定義綁定update ko.valueHasMutated

目前我正在使用此解決方案,因為我知道有人會提出它。 但這只是一個hack,我希望有人提供“適當的”解決方案。

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");
    }
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM