2015-12-21 62 views
0

我有一個敲除自定義綁定,稱爲groupedOptions,它將select列表的選項與optgroup s綁定。這與標準選項綁定相同,但包含處理選項組的邏輯。自定義綁定後運行默認綁定

綁定在knockout v2.3下正常工作,但在升級到v3.3後停止工作。更新後,它將不再正確綁定值。

在看看源的值,在新版本綁定它有一些代碼來告訴它的選項後,運行結合:

ko.bindingHandlers['value'] = { 
    'after': ['options', 'foreach'], 
    'init': function (element, valueAccessor, allBindings) { 
    ... 

此更改爲:

ko.bindingHandlers['value'] = { 
    'after': ['options', 'foreach', 'groupedOptions'], 
    'init': function (element, valueAccessor, allBindings) { 
    ... 

將工作,但對我來說似乎有點哈克。有沒有人有任何想法是最好的做法是做到這一點。

換句話說:如果我有一個自定義綁定需要在knockout中定義的綁定之前運行,我將如何在不編輯knockout源的情況下執行該綁定?

+0

你可以發佈你的'groupedOptions'綁定處理程序的代碼嗎? – nemesv

+0

第二@nemesv。我已經回答了實際問題(「如何在默認綁定之前運行自定義綁定」),但是擔心你有[XY-問題](http://meta.stackexchange.com/questions/66377/what-is-the -xy-problem),你應該可能正在修復/更改自定義綁定本身。 – Jeroen

+0

groupedOptions綁定是一個複製和粘貼的選項,它是從onuralp這個問題的解決方案http://stackoverflow.com/questions/8972367/knockoutjs-select-with-option-group。 所以這確實是一個XY問題,當我爲此搜索時,我已經看到人們或者直接編輯knockout綁定來支持分組,用foreach來做(這是cumersom,如果你有很多下拉菜單需要分組)。 我採取的方法的缺點是每個淘汰賽版本更新都要求重新實施,但我們沒有重複使用惡意軟件。 – Gunner

回答

1

底線包含實際的問題:

如果我有一個自定義綁定需要綁定機制在淘汰賽定義之前運行,我會怎麼做,而無需編輯淘汰賽源?

就像這樣:

ko.bindingHandlers['value'].after = ko.bindingHandlers['value'].after.concat('customBinding'); 

看到它(間接)在這裏工作:

ko.bindingHandlers['customBinding'] = { 
 
    init: function() { console.log("The `customBinding` was initialized."); } 
 
}; 
 

 
ko.bindingHandlers['value'].after = ko.bindingHandlers['value'].after.concat('customBinding'); 
 

 
console.log(ko.bindingHandlers['value'].after); 
 

 
ko.applyBindings({ 
 
    // *pure* computed, or else it would be evaluated once straight away 
 
    myObs: ko.pureComputed(function() { console.log("The `value` binding was initialized."); }) 
 
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script> 
 

 
<input data-bind="customBinding, value: myObs">

PS。你確定你沒有XY問題嗎?