4

RequireJS を使用して記述されたバックボーン マルチページ アプリがあります。マルチページなので、面倒なのでルーターは使わないことにしました。アプリ全体で使用するシングルトン オブジェクトを作成する複数の方法を試しました

var singletonModel= Backbone.Model.extend({

}),
return new singletonModel;

上記の場合、定義メソッドを使用してクラスの singletonModel モデルを参照し、それをそのまま呼び出しています

this.singleton = singletonModel;
this.singleton.set({'test': 'test'});

次のページのモジュールで、次のようなものを呼び出します

this.singleton = singletonModel;
var test = this.singleton.get('test');

シングルトン オブジェクトが再初期化されたようで、テスト オブジェクトが null です

var singletonModel= Backbone.Model.extend({

}, {
    singleton: null,
    getSingletonModelInst: function () {
        singletonModel.singleton =
            singletonModel.singleton || new singletonModel;
        return singletonModel.singleton;
}

});
return singletonModel;

上記の場合、定義メソッドを使用してクラスの singletonModel モデルを参照し、それをそのまま呼び出しています

this.singleton = singletonModel.getSingletonModelInst();
this.singleton.set({'test': 'test'});

次のページのモジュールで、次のようなものを呼び出します

this.singleton = singletonModel.getSingletonModelInst();
var test = this.singleton.get('test');

ここでも、シングルトン オブジェクトが再初期化され、テスト オブジェクトが null になっているようです。

ルーターのないマルチページアプリを使用しているため、状態が保持されていないためかどうか疑問に思っていますか? マルチページアプリでシングルトンオブジェクトを使ってみた人はいますか? もしそうなら、シングルページ アプリでの実装方法とは何か違うことをしましたか?

ありがとう、ダーム

4

3 に答える 3

9

Bart の回答は非常に優れていますが、require.js を使用してシングルトンを作成する方法については述べていません。答えは短く、すでにインスタンス化されたオブジェクトを返すだけです:

define([], function() {

   var singleton = function() {
      // will be called only once
   }

   return new singleton()
})

ここでは、シングルトンはもうありません:

define([], function() {

   var klass = function() {
      // will be called every time the module is required
   }

   return klass
})
于 2013-05-30T21:39:02.193 に答える
0

最近の Backbone/Require アプリケーションでシングルトンを実装した方法を次に示します。状態は、任意の数のビューにわたって記憶されます。

インスタンス/repoModel.js

define(['models/Repo'],
    function(RepoModel){
        var repoModel = new RepoModel();

        return repoModel;
    }
);

モデル/Repo.js

define(['backbone'],
    function(Backbone){

        return Backbone.Model.extend({
            idAttribute: 'repo_id'
        });
    }
);

ビュー/SomePage.js

define(['backbone', 'instances/repoModel'],
    function(Backbone, repoModel) {

        return Backbone.View.extend({
            initialize: function() {
                repoModel.set('name', 'New Name');
            }
        });
    }
);
于 2013-05-30T20:36:33.493 に答える