OKみんな-これに頭をぶつけていました。これは、Revealing Prototype パターンから構築されたクラスの配列を使用する際の「ポインター」の問題だと思います。また、バインディングにノックアウト js を使用しています。
問題:通常、自分のサイトには非常に複雑なページがあります。その結果、他のクラスの配列を含むクラスを持つ傾向があります。私は常に Revealing Prototype Pattern を使用しており、通常はinit関数で「 this」を指す「 self」変数を持っているため、イベント ハンドラーによって呼び出されるそのクラスの他の関数はthisへのポインターを持ちます(そしてそれは失敗しません-「自己」が何であるかを知っているようです)。
しかし....クラス(モデル)の配列があると、正しく機能しません....私のMailModelクラス(私のビューモデル)にはPeopleクラスの配列があります... Peopleクラスの「 self 」がポイントされます「this」に、しかしプロトタイプの他の関数が「self」を呼び出すと、配列内の最後の「person」項目を指しているようです?? -インスタンス化するすべてのクラスで共有関数として「自己」を何らかの形で公開しています..そして、どういうわけか「これ」の最後のインスタンスを指していますか??
「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);
アップデート:
呼び出しで「これ」を使用しない理由を疑問に思っているコメントが表示されます-私の場合、人のインスタンスではないこれらのプロトタイプ関数を呼び出す他のものがあります(したがって「これ」は機能しません)-更新しました合計の totalNums KnockoutJS 計算関数を使用して Person プロトタイプを表示する私の jsFiddle - その関数に「this」を入れると、「this」は「Window」オブジェクトであるため失敗します - 以前と同様に、「self」を使用してそれを見ることができます" は、配列の最後の人を参照するだけです (全員の "totalNums" が 80 であることに注意してください (Suzy Chapstic)
その「totalNums」をコンストラクターに移動しても問題ありませんが、関数をプロトタイプに落としたいと思います。では、プロトタイプの計算された関数内の「this」インスタンスへの参照を取得するにはどうすればよいでしょうか?
この KnockoutJS 計算関数の更新されたフィドルは次のとおりです。