【问题标题】:PublishOn not firing when I delete input content当我删除输入内容时,PublishOn 没有触发
【发布时间】:2015-01-29 17:11:47
【问题描述】:

我正在使用淘汰赛邮箱来标记脏标志。代码如下所示:

var ProfileModel = function() {
    this.nickName = ko.observable("name1").publishOn("dirty", true);
    this.emailAddress = ko.observable("email1").publishOn("dirty", true);
};

ko.postbox.subscribe("dirty", function(newValue) {
    // enable Save button
}, this);

nickName 和 emailAddress 绑定到输入框。

<div id="profile">
    <input data-bind="value: nickName" /> </label>
    <input data-bind="value: emailAddress" /></label>
</div>

重现问题的步骤:

  1. 用户到昵称输入框删除内容。引发dirty 并启用“保存”按钮。
  2. 用户单击保存按钮。更改已保存,“保存”按钮变为禁用。
  3. 用户转到 emailAddress 并删除内容。 dirty 不会以某种方式提出。用户无法保存更改。
  4. 用户在 emailAddress 或 nickName 上键入内容。引发dirty 并启用“保存”按钮。

您可以查看jsfiddle 以查看它的实际效果。 jsfiddle示例中没有保存按钮,只是尝试删除nickName的内容,然后删除emailAddress。您将看到删除 emailAddress 不会引发 dirty 事件。

这是淘汰邮箱中的已知错误吗?有没有更好的方法来检查淘汰赛的脏度?

【问题讨论】:

  • 是的,我看到了问题 - 我怀疑这是邮箱中的错误。我不以这种方式使用邮箱,所以无能为力。对于编辑/保存/取消,请查看github.com/stevegreatrex/ko.plus - 一个很好的编辑/取消/提交功能。

标签: knockout.js knockout-postbox


【解决方案1】:

默认情况下,knockout-postboxpublishOn 功能不会再次发布最新值。在您的示例中,您为“dirty”(空昵称)发布一个空字符串,然后再次发布一个空字符串(空电子邮件)。

publishOn 确实支持传入你自己的相等比较器。在您的情况下,您可以传入一个始终返回 false 的函数。

例如:

var alwaysPublish = function() { return false; }

var ProfileModel = function() {
    this.nickName = ko.observable("Ryan").publishOn("dirty", true, alwaysPublish);
    this.emailAddress = ko.observable("ryan@knockmeout.net").publishOn("dirty", true, alwaysPublish);
    this.log = ko.observableArray();
};

这是一个小提琴:http://jsfiddle.net/rniemeyer/qmbwhk8a/

您还可以通过设置ko.postbox.defaultComparer 来全局覆盖比较功能。

【讨论】:

  • 这解决了我的问题。谢谢!但是有一个问题:由于publishOn 已附加到源,因此抑制来自同一源的重复值,而不是将重复值抑制到同一目标不是更直观吗?
  • @kennethc - 是的,我可能会仔细研究一下需要进行的更改。该值在主题级别缓存,因此这就是它要与之比较的内容。我认为尽管您有一个完全有效的用例,但 lib 无法直观地处理。
猜你喜欢
  • 1970-01-01
  • 2019-08-29
  • 1970-01-01
  • 2020-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多