KnockoutJS订阅具有相同回调操作的多个observable

Joe*_*oel 19 javascript knockout.js

我在KnockoutJS中有一个模型类,它有多个我想订阅的值.每个订阅都将执行相同的任务,如下所示:

function CaseAssignmentZipCode(zipCode, userId, isNew) {
  var self = this;
  self.zipCode = ko.observable(zipCode);
  self.userId = ko.observable(userId);
  self.isNew = isNew;
  self.isUpdated = false;

  self.zipCode.subscribe(function () { self.isUpdated = true; });
  self.userId.subscribe(function () { self.isUpdated = true; });
}
Run Code Online (Sandbox Code Playgroud)

有没有办法将这两个调用结合起来订阅,以便我可以使用一个订阅来"监视"这两个值?

RP *_*yer 26

您可以为此目的使用计算的observable.您只需要确保在read函数中访问每个observable的值.会是这样的:

ko.computed(function() {
   self.zipCode();
   self.userId();
   self.isUpdated = true;
});
Run Code Online (Sandbox Code Playgroud)

因此,您依赖于两个observable并设置您的标志.

此外,如果您正在寻找类似"脏"标志的东西,那么您可能会考虑以下内容:http://www.knockmeout.net/2011/05/creating-smart-dirty-flag-in-knockoutjs.html.这个想法是你使用一个计算的observable调用对象上的ko.toJS()来解包它的所有可观察对象.

  • 我已经看到了这个解决方案,我对它并不满意,因为计算机并没有真正计算任何东西,所以代码更难理解. (3认同)
  • 计算的可观察量不一定需要返回值.依赖性跟踪机制有许多用途.作为示例,Knockout使用计算来跟踪绑定中的依赖关系.以下是关于计算机可以使用的一些方法的最新文章:http://blog.safaribooksonline.com/2014/02/19/getting-knockout-js-computed-observables/ (3认同)

Ser*_*sev 17

你不想复制处理函数的主体吗?将其解压缩到变量.

function CaseAssignmentZipCode(zipCode, userId, isNew) {
  var self = this;
  self.zipCode = ko.observable(zipCode);
  self.userId = ko.observable(userId);
  self.isNew = isNew;
  self.isUpdated = false;

  var handler = function () { self.isUpdated = true; };

  self.zipCode.subscribe(handler);
  self.userId.subscribe(handler);
}
Run Code Online (Sandbox Code Playgroud)

  • 过去,我一直偏爱计算方法。但当我看到这个的时候,我觉得当时我可能已经喝醉了。现在已经使用淘汰赛构建了许多企业解决方案,这是我的首选方法。 (2认同)
  • 使用计算方法的一个好处是您可以对计算进行限流 (2认同)