2015-12-21 63 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问题吗?