2

すべてのBackbone.Viewは、最終状態で1回だけ使用されます。(アイテムビューを除く)。

現在、Backbone.Viewsをシングルトンとして次のように処理しています。

var Singletonizer = function(Singleton) {
    if (Singleton._instance) return Singleton._instance;

    Singleton._instance = new Singleton();

    Singletonizer(Singleton);
};

残念ながら、この小さな関数をリポジトリ内の各amdモジュールへの依存関係として追加するのはそれほど良いことではありません。

これを処理する別の方法はありますか?たぶん、ベースビュークラスを上書きしますか?

4

2 に答える 2

6

次の場合とは異なり、モジュールにビューコンストラクター以外の関数を返すようにします。この関数は、代わりにその単一のインスタンスを返します。このように、モジュールをロードするときに、好むと好まざるとにかかわらず、インスタンスを自動的に取得することはありません。代わりに、「FailedXhrView」モジュールをロードした後、を呼び出してシングルトンを取得しますFailedXhrView()

'use strict';

define(['jquery', 
        'underscore', 
        'backbone', 
        'text!templates/failedXhr.html'], 

function($, _, Backbone, failedXhrTemplate) {
    var FailedXhrView = Backbone.View.extend({
        el : $('#failedxhr-modal-container'),
        template : _.template(failedXhrTemplate),

        render : function() {
            this.$el.html(this.template({}));
            this.$el.find('failedxhr-modal-containee').modal();
            return this;
        }
    });

    var instance;

    return function() {
        if (!instance) {
            instance = new FailedXhrView();
        }
        return instance;
    }
});
于 2013-09-17T13:01:18.810 に答える
4

非常にお勧めの本「背骨のあるレシピ」から:

ここから:

// definition
MyApplication.Views.List = Backbone.View.extend();

// instantiation
$(function() {
  MyApplication.ListView = new MyApplication.Views.List({
    el: $('#list')
  }); 
})

ここへ:

$(function() {
  MyApplication.ListView = new (Backbone.View.extend({
    initialize: function() {
      // ...
    }
  }))({el: $('#list')})
});

匿名クラスのインスタンス化をに割り当てますMyApplication.ListView。このアプローチでは、カスタム属性とメソッドを使用して、トップレベルのバックボーンクラスの一般的な拡張を実行しています。ただし、違いは、前に行ったように結果をクラス名に割り当てないことです。代わりに、この匿名クラスの新しいインスタンスをすぐに作成します。最後にMyApplication.ListView、結果のオブジェクトに割り当てられます。

私はこのようなテクニックを使ったことがないと言わざるを得ません。それは私には厄介に見えます、私は建築よりも読みやすさを好みます。

于 2012-08-31T19:18:59.057 に答える