考虑以下示例:
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);
}
};
});
你能否澄清以下几点:
this
中allDone
的值不是job
?是不是allDone
通过$parent
来调用job
?allDone
,this
的值为job
? this
和data
的值似乎相似,但不完全相同:
this -> String {0: "S", 1: "l", 2: "e", 3: "e", 4: "p", length: 5}
data -> Sleep
有什么区别?
答案 0 :(得分:2)
this
正在allDone
函数的范围内运行,因此它不会引用job
。 allDone
是通过$parent
调用的,在本例中是job
,但这是在数据绑定语法中 - 这并不意味着您在{Javascript}中this
将参考job
。
是的,您可以将作业的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());
您的原始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