【问题标题】:Knockout subscribe triggers on page load for selectbox选择框的页面加载时的淘汰订阅触发器
【发布时间】:2017-01-31 20:49:03
【问题描述】:

我使用 subscribe 创建了一个扩展器,目的是拦截用户对输入字段的更改并强制设置一个值。

例如,我在 observable 上设置了“Bar”的强制值。如果用户将其更改为“Foo”,我将强制它为“Bar”并通知用户。 (用于原型/示例解决方案)。

它适用于文本框和单选按钮但不适用于选择框。它似乎在页面加载时触发,而不仅仅是在更改时触发。

小提琴:https://jsfiddle.net/4gus57pd/7/

ko.extenders.forcedValue = function(target, newValue) {
    target.subscribe(function(writtenValue) {
        console.log(target()+" - "+newValue);
        if(newValue != writtenValue){
            alert("In this example we will use the value "+newValue+" instead.");
        }           
        target(newValue);
    });     
    return target;
};
this.textbox = ko.observable("Foo").extend({ forcedValue: "Bar" });
this.selectbox = ko.observable(1).extend({ forcedValue: 2 });

当您运行它时,尽管值未更改,但仍会触发选择框扩展器?

【问题讨论】:

  • 它对我来说改变得很好。 (FF 51.0.1、Chrome 55.0.2883、IE 11),但是,在页面加载时,尽管弹出警报,所有浏览器中的值都是 1。
  • @Balázs 这就是问题所在,警报是在页面加载时触发的。只有在更改为不同的值时才会弹出。

标签: javascript knockout.js


【解决方案1】:

value 属性是一个string,因此 Knockout 将尝试将值 ["1", "2", "3"] 匹配到您的 observable,其中包含数字 12。它没有看到选定的值,因此它将您的 observable 更新为第一个 <option>

如需快速解决方案,请将您的 selectbox 更改为 ko.observable("1"),并将强制值更改为 "2"

其他建议,与问题无关:

您当前的扩展程序将始终触发两次订阅更改。一个用于第一次更改,一个用于实际重置。如果你将 observable 包装在一个读/写计算中,你会反驳这个:

ko.extenders.forcedValue = function(target, forcedValue) {
  return ko.computed({
    read: target.extend({ notify: "always" }),
    write: function(newValue) {
      console.log("Attempt:", target(), "->", newValue);

      if (newValue !== forcedValue) {
        console.log("Using " + forcedValue + " instead."); 
        target(forcedValue);
      } else {
        target(newValue);
      }

    }
  }).extend({ notify: "always" });
};

【讨论】:

  • 当然!这就是为什么当我使用可观察数组代替选项时它起作用的原因。谢谢!
  • 是的,感谢您的建议,但从未真正了解如何使用读/写选项。欣赏!
  • 您的脚本似乎只适用于第一次更改,如果您多次更改该值,它会通过吗? jsfiddle.net/4gus57pd/14 或者,如果您重新加载页面,它似乎会保留该值,但在更改后它看起来好像没有..
  • 啊,我忘记了一个额外的notify: "always" 扩展器。发生的情况是,当计算“跳过”无效更新时,值从 2 变为 2。这不会自动触发更新,因此 UI 将开始滞后。 read observable 需要被告知总是分享设置新值的尝试。在此处修复:jsfiddle.net/8gpyjLj2
  • 感谢修复和解释!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多