2

我刚刚第一次阅读了敲除库网站的入门文档,并且有一个关于如何在发送到敲除订阅函数的回调函数中指定this关键字的目标的问题,在跟踪更改的上下文中正在观察其属性的一组对象。

我需要跟踪 100 个属性最初为空的对象。这 100 个对象中的每一个都可以用同一个视图模型来描述:

       var myViewModel = {
          personName: ko.observable(null),
          personAge: ko.observable(null)
       };


      var my100 = {
        a1:  myViewModel,
        a2:  myViewModel,
        .
        .
        .
        a100: myViewModel

      }

subscribe() 函数的第二个参数“定义了回调函数中this的值”。http://knockoutjs.com/documentation/observables.html

当我需要知道这 100 个对象中的哪一个发生了变化时,我不确定第二个参数是什么。当视图模型中的任何属性从 null 更改为一个值,或从一个值更改为另一个值时,我想知道更改发生在哪个对象中,例如a88

           myViewModel.personName.subscribe(myCallback, ?, "change");
           myViewModel.personAge.subscribe(myCallback, ?, "change");

知道哪个属性发生了更改也很好,但更重要的是我知道其属性已更改的对象。

4

1 回答 1

1

在正确的范围内保存对视图模型本身的引用可能更容易,因此它可用于回调。如果您使用构造函数构建视图模型,这将更具可读性:

var Person = function() {
    var self = this;

    self.personName = ko.observable(null);
    self.personAge= ko.observable(null);

    self.personName.subscribe(function(newValue) {
        // "self" is a variable reference to the correct Person here
        // newValue is the new value for the observable
        // calling "myCallback" here allows you to pass those at your leisure
    });
};

请参阅this fiddle了解这将如何工作。

PS。如果回调很短,您甚至可能不需要单独的myCallback函数,只需在subscribe调用中内联的函数内完成工作,您已经拥有对正确this值的引用(保存在self变量中)。

于 2013-09-10T12:18:15.430 回答