10

作業したサイトをBackbone.js0.5.3からBackbone.js0.9.2にアップグレードするだけです。アップグレードすると、モデルの初期化メソッドで使用するオプションパラメーターが未定義になります。V.5からV.9への変更点

初期化:function(options){ enter code here }

これが私のモデル構造です。0.5.3ではすべて正常に機能しますが、0.9.2オプションを使用すると機能しなくなります。

this.myModel = Backbone.Model.extend({

        defaults: function() {
            return {
                maxDays: 7,
                index: 0

            };
        },

        initialize: function( options ) {

        }

})



this.model = new myModel();

バージョン0.5.3では、オプションはデフォルトオブジェクトに設定されたすべての属性を表示します。しかし、バージョン0.9.2では、これは機能しなくなり、未定義を返します。クライアントの機密性のため、リンクを投稿できません。

4

1 に答える 1

15

初期化の署名は、0.5 から 0.9 まで変更されていないと思います。ただし、オプションをコンストラクターに渡す場合にのみ、渡されたオプションを取得します。Backbone.Modelの注釈付きソースを確認してください。新しいモデル インスタンスをインスタンス化するたびに、コンストラクターは次のことを行います。

this.initialize.apply(this, arguments);

したがって、コンストラクターに渡すものはすべて、変更されずに渡されて初期化されます。したがって、新しいモデル インスタンスをインスタンス化しているが、2 つの引数 (属性とオプション) を渡していない場合について、コードを調べてください。

コード サンプルに基づいて、initialize2 つのパラメーターを受け取るように定義する必要があります。attributesまたoptions、モデルを作成するときに、オプションを渡すだけの場合は、次のようにします。

var model = new Model(null, options);

また

var model = new Model({}, options);

コードを壊した特定の変更は、0.5.3 で明示的な引数を使用して初期化を呼び出すことから、次のように 0.9.3 で適用と引数を使用するように切り替えたことだと思います。

    this.initialize.apply(this, arguments);

したがって、0.9 では、 を介してデフォルトにアクセスできますthis.attributesが、コンストラクター関数へのパラメーターとして入っていない限り、関数パラメーターとして入ってくることはありません。

var MyModel = Backbone.Model.extend({
    defaults: {x: 42, y: 43},
    initialize: function(attributes, options) {
        console.log(arguments, attributes, this.attributes);}
});
var m = new MyModel();

引数が空であるためログに記録[], undefined, Objectされ、コンストラクターに何も渡されていないため属性は未定義ですが、デフォルトが設定されてthis.attributesおり、使用できます。

于 2012-04-27T18:57:41.313 に答える