[英]custom binding is not firing update
我正在使用使用Knockout.js和Jquery Mobile UI組合的系統。 我遇到的問題之一是讓Jquery Mobile應用於具有knockout :if
綁定的元素。 我們使用的最初解決方案是在調用ko.applyBindings
和ko.valueHasMutated
頁面周期觸發事件中,然后在事件處理程序中調用以下內容
$(element).find('div[data-onthemovecollapsible="true"]:not(div[data-role="collapsible"])').attr("data-role", "collapsible");
$(element).collapsibleset().collapsibleset("refresh");
問題在於,這有時會被調用很多次,或者有時有人會忘記觸發所需的事件,並一遍又一遍地產生相同的錯誤,因此企業決定采用以下邏輯將該機制移至自定義綁定:如果元素已綁定(變得可見或其他方法最終顯示在頁面上),然后應用JQuery移動用戶界面。 自定義綁定的init
等同於ko.applyBindings
, update
等同於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.