0

我试图通过淘汰来实现以下行为:当用户提交他的登录名和密码并且它是错误的时 - 向他显示错误消息。当用户更改任何输入时 - 隐藏消息。

我用计算的 observable 进行了尝试,并明白这不是正确的方法,在阅读了有关订阅的文档后,我发现了. 因此,当我订阅每个input. 问题是我将两个 observables 都订阅了同一个事件(因此复制了代码)。我知道我可以将重复的代码放入一个函数中,并为每个可观察的函数订阅,但这对我来说也不是很好。

够了这个空话,这是我的小提琴(点击让它出错,然后输入一些东西input),这就是我这样做的方式:

this.loginText.subscribe(function () {
   self.isError(false);
});

this.passwordText.subscribe(function () {
   self.isError(false);
});

我试图在这里阅读类似的问题,但无法理解我如何将多个可观察对象订阅到同一事件。

4

2 回答 2

2

您应该使用计算的 observable。当依赖的 observable 发生变化时,每次都会计算计算的 observable。因此,您可以简单地在计算的可观察对象中列出所有可观察对象(绑定到您的输入),并更改其中至少一个调用计算函数。

function User() {
    var self = this;
        self.loginText      = ko.observable(null);
        self.passwordText   = ko.observable(null);
        self.isError        = ko.observable(false);

        self.makeWrong = function(){
            self.isError(true);
        }

        ko.computed(function() {
            self.loginText();
            self.passwordText();
            self.isError(false);
        });
    }

演示

于 2014-03-09T12:17:22.983 回答
1

如果你不想使用 ko.computed 那么你可以使用扩展器。有关扩展器的更多信息http://knockoutjs.com/documentation/extenders.html

所以对于相同的功能扩展器将是

ko.extenders.ErrorCheck = function(target, option) {
  target.subscribe(function(newValue) {
    console.log("new Value is " + newValue);
    self.isError(false);
  });
  return target;
}; 

可观察到的是:-

this.loginText = ko.observable(null).extend({ErrorCheck:""});
this.passwordText = ko.observable(null).extend({ErrorCheck:""});

小提琴演示

于 2014-03-09T12:21:48.623 回答