KnockoutJS中“click”处理程序中“this”的值是多少?

时间:2014-02-09 22:29:19

标签: knockout.js

LIVE DEMO

考虑以下示例:

HTML:

<div data-bind="with: job">
  <div data-bind="foreach: tasks">
    <div>
      <span data-bind="text: $data"></span>
      <span data-bind="click: $parent.allDone">(Done)</span>
    </div>
  </div>
</div>

JS:

ko.applyBindings(function() {
  this.job = {
    tasks: ['Buy milk', 'Sleep', 'Work', 'Praise'],
    allDone: function(data) {
      console.log(this);
      console.log(data);
    }
  };
});

你能否澄清以下几点:

  1. 为什么thisallDone的值不是job?是不是allDone通过$parent来调用job
  2. 有没有办法在点击时调用allDonethis的值为job
  3. thisdata的值似乎相似,但不完全相同:

    this -> String {0: "S", 1: "l", 2: "e", 3: "e", 4: "p", length: 5}

    data -> Sleep

    有什么区别?

1 个答案:

答案 0 :(得分:2)

  1. this正在allDone函数的范围内运行,因此它不会引用joballDone是通过$parent调用的,在本例中是job,但这是在数据绑定语法中 - 这并不意味着您在{Javascript}中this将参考job

  2. 是的,您可以将作业的this值设置为另一个变量。常见的方法是使用var self = this。然后,您可以在子函数范围内通过job引用父对象(self)。见fiddle

    var job = function () {
        var self = this;
    
        this.tasks = ['Buy milk', 'Sleep', 'Work', 'Praise'];
        this.allDone = function (data) {
            console.log(self); // refers to the parent job now
            console.log(data); // refers to the current item in the data-bound array
        };
    };
    
    ko.applyBindings(new job());
    
  3. 您的原始this将简单字符串视为new Object(data)。 使用原始代码, new Object(data) - &gt; String {0: "S", 1: "l", 2: "e", 3: "e", 4: "p", length: 5}

    有关详细信息,请参阅this SO post。另一篇可供参考的帖子是this SO post on Property value of a String object in JavaScript