3

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 サブモデル間でグローバル変数にするにはどうすればよいですか?

ありがとう

読んでくれてありがとう:)。

4

1 に答える 1

3

RunnableListインスタンスで作業する必要があるときに、リスト プロトタイプで直接作業しようとしています (new RunnableList()たとえば)。試す

var lst = new RunnableList();
lst.push(new RunnableSubModel({id: 'mySubModel', alwaysOn: true}));
var mySubModel = lst.get('mySubModel');
mySubModel.run();

そしてhttp://jsfiddle.net/NwmHr/1/で遊ぶフィドル

デフォルトの ID を設定すべきではないことに注意してください。ID を指定せずに複数のインスタンスを作成すると (少なくともコレクションに追加するとき)、衝突が発生する可能性があります。

の2 番目の引数をextend使用して共有変数を追加しますが、DOM を処理するモデルは通常疑わしいと見なされます。

于 2013-08-03T16:09:37.993 に答える