Backbone を正しく理解していないと思うので、この問題に遭遇しました。
Runnable というスーパークラスと、そこから継承された一連のサブクラスがあります。
var Runnable = Backbone.Model.extend({
template: $("#template"),
defaults: function(){
return {
id: '',
alwaysOn: false,
}
}
run: function() {
}
});
var RunnableSubModel = Runnable.extend({
run: function() {
//do some custom stuff here
}
});
... any many more runnable sub models ...
ここで、ID で取得して新しい run メソッドを呼び出すことができる Runnable サブモデルのコレクションが必要です。
var RunnableList = Backbone.Collection.extend({
model: Runnable,
run: function() {
this.each(function(runnable) {
runnable.run();
});
}
});
RunnableList.push([
new RunnableSubModel({id: 'mySubModel', alwaysOn: true})
]);
//POST EDIT (forgot this)
var lst = new RunnableList();
//doesn't work, looks for Runnable id value
var mySubModel = lst.get('mySubModel');
//doesn't work, looks at Runnable.run() not RunnableSubModel.run()
mySubModel.run();
しかし、これは私が期待するようには機能しません。
id 属性はどこにも設定されず、Runnable のデフォルトが変更された場合にのみ変更されます (役に立たなくなります!)。
mySubModel の run メソッドは、RunableSubModel で上書きされた run() メソッドではなく、親モデルから Runnable.run() を呼び出します。
バックボーンで継承がどのように機能するか (または機能する必要があるか) について、明らかに間違った仮定をしていますが、包括的な説明を実際に見つけることはできません。
答え
解決策は、 lst.push([obj]); を使用していたことです。
これは、lst.add([obj,obj,..]) または lst.push(obj); である必要があります。
バックボーンは巧妙で、親オブジェクト (Runnable) にフォールバックしていました!
環境
私は自分の仕事を間違った方法で行っている可能性があります (これは私の最初の OOP / バックボーン js プロジェクトであるため:D)。
2 つのコレクション間に 1 対多のマッピングがあります。1 つ目は、GUI チェックボックスを表すモデルのコレクションです。次に、それぞれが Runnable オブジェクトの 1 つを参照します。問題は、複数のチェックボックスが同じ Runnable インスタンスを参照できることです。これを行うために、(実行するために) Runnables のコレクションがあり、チェックボックスのコレクションを作成するときに ID でそれぞれを参照したいと考えています。チェックボックス モデルが「チェック済み」/「チェック解除済み」の場合、Runnable に通知し、Runnable は他のリッスンしているチェックボックスに通知します。
サイドノート
「テンプレート」変数をすべての Runnable サブモデル間でグローバル変数にするにはどうすればよいですか?
ありがとう
読んでくれてありがとう:)。