【问题标题】:Run default binding after custom binding自定义绑定后运行默认绑定
【发布时间】:2016-03-27 12:44:52
【问题描述】:

我有一个名为groupedOptions 的淘汰自定义绑定,它将select 列表的选项与optgroups 绑定。这与标准选项绑定相同,但包括处理选项组的逻辑。

绑定在淘汰赛 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) {
    ...

会工作,但对我来说似乎有点 hacky。有谁知道最好的做法是什么。

换句话说:如果我有一个自定义绑定需要在淘汰赛中定义的绑定之前运行,我将如何在不编辑淘汰赛源的情况下执行此操作?

【问题讨论】:

  • 你能把你的groupedOptions绑定处理器的代码贴出来吗?
  • 第二个@nemesv。我已经回答了实际问题(“如何在默认绑定之前运行自定义绑定”),但担心您有 XY-problem,您可能应该考虑修复/更改您的自定义绑定本身。
  • groupedOptions 绑定是选项的复制和粘贴,它是来自 onuralp 从这个问题stackoverflow.com/questions/8972367/… 的解决方案。所以这确实是一种 XY 问题,当我用谷歌搜索这个问题时,我看到人们要么直接编辑淘汰赛绑定以支持分组,而是使用 foreach 来完成(如果你有许多需要分组的下拉菜单,这是很麻烦的)。我采用的方法的缺点是每次淘汰版本更新都需要重新实现,但我们不会重复 foreaches。

标签: javascript knockout.js binding


【解决方案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 问题吗?

【讨论】:

    猜你喜欢
    • 2022-01-01
    • 2013-06-14
    • 2018-10-13
    • 1970-01-01
    • 2010-11-08
    • 1970-01-01
    • 2018-08-22
    • 2023-03-30
    • 2015-11-05
    相关资源
    最近更新 更多