好的,伙计们-一直在敲我的头。在使用从显示原型模式构建的一系列类时,我觉得这是一个“指针”问题。另外,我正在使用 knockoutjs 进行绑定。
问题:我的网站上通常有非常复杂的页面。因此,我倾向于拥有包含其他类数组的类。我一直使用显示原型模式,并且通常在init函数中有一个“ self ”变量指向“ this ”,这样事件处理程序调用的该类中的其他函数将有一个指向this的指针(它不会失败——它似乎知道什么是“自我”)。
但是......当我有一个类(模型)的数组时,它不能正常工作......我的MailModel类(我的视图模型)有一个People 类的数组...... People 类中的“ self”被指出到"this",但是当原型的其他函数调用 "self" 时,它似乎指向数组中的最后一个 "person" 项??-我是否以某种方式将“self”公开为它实例化的所有类的共享函数......并以某种方式指向“this”的最后一个实例?
我试图做一个包含“Person”类数组的视图模型的简单模型。请有人帮我解决这个问题。我尝试了在“Person”类上使用这个“this”指针的不同方法,但无济于事。
一探究竟!
var $results = $('#results');
var Person = function(data) {
this.id = ko.observable();
this.name = ko.observable();
this.init(data);
}
Person.prototype = function(){
var self,
init = function(data){
self = this;
self.id(data.id || 0)
.name(data.name)
},
sayHi = function(){
$results.find('.wrong').text(self.name()).end()
.find('.correct').text(this.name()).end()
.show();
};
return {
init: init,
sayHi: sayHi
}
}();
var MainModel = function(people){
this.people = ko.observableArray([]);
this.init(people);
}
MainModel.prototype = function(){
var self,
init = function(people){
self = this;
_.each(people, function(person){
self.people.push(new Person(person));
});
/* do lots of other stuff */
};
return {
init: init
}
}();
var people = [
{id: 1, name: 'Bill Smith'},
{id: 2, name: 'John Doe'},
{id: 3, name: 'Suzy Chapstick'},
];
var vm = new MainModel(people);
ko.applyBindings(vm);
更新:
我看到评论想知道为什么我不会在我的调用中只使用“this”-在我的情况下,我还有其他东西调用了这些不是 person 实例的原型函数(所以“this”不起作用)-我已经更新了我的 jsFiddle 用 totalNums KnockoutJS 计算函数来显示 Person 原型,如果我把“this”放在那个函数中,它会失败,因为“this”是“Window”对象——和以前一样,你可以看到使用“self " 只是指数组中的最后一个人(注意每个人的“totalNums”是 80 (Suzy Chapstic)
如果我将“totalNums”向上移动到构造函数中,那很好,但我希望我的函数在原型中向下。那么......我怎样才能在原型上的计算函数中获得对“this”实例的引用?
这是这个 KnockoutJS 计算函数的更新小提琴: