1

1つのビューで複数のモデルをどのように呼び出しますか

通常の場合、バックボーンモデルを作成します

var myModel = Backbone.Model.extend({ url:"api/authentication"});

次に、それをビューに割り当てて、特定のビューのデフォルトモデルにします

    var LoginView = Backbone.View.extend({
        model: new myModel(),
        initialize: function(){
            _.bindAll(this, 'render', 'render_thread_summary', 'on_submit', 'on_thread_created', 'on_error');
            this.model.bind('reset', this.render); 
            this.model.bind('change', this.render); 
            this.model.bind('add', this.render_thread_summary); 
        },
        ...
    });

しかし、1つのビューにさまざまなモデルを呼び出す多くのメソッドがあります。現在、イベントメソッド内にモデルのインスタンスを作成しています。

私が考えている他の解決策は次のようになります

initialize: function(){
   _.bindAll(this, 'render', 'render_thread_summary', 'on_submit', 'on_thread_created', 'on_error');
   new.model1().bind('reset', this.render); 
   new.model2().bind('change', this.render); 
   new.model3().bind('add', this.render_thread_summary); 
},

しかし、これらの良い習慣はありますか?これを行う他の方法は何ですか。ありがとう。

更新 ピーターに応えて、これが私の実際のコードです

var userRegModel                = Backbone.Model.extend({url: fn_helper.restDomain()+'user/reg'});
var userResendActivationModel   = Backbone.Model.extend({url: fn_helper.restDomain()+'user/token/activation/new'});
var userResetPassModel1         = Backbone.Model.extend({url: fn_helper.restDomain()+'user/pwdreset/token/new'});
var userResetPassModel2         = Backbone.Model.extend({url: fn_helper.restDomain()+'user/pwdreset/change'});
var userLoginModel              = Backbone.Model.extend({url: fn_helper.restDomain()+'user/login'});

_view:  Backbone.View.extend({
                el:             'div#main-container',
                initialize:     function(){},
                events: {
                    'click #user-signup':            'signupUserFn', //userRegModel 
                    'click a#activation-resend':     'resendActivationFn',//userResendActivationModel
                    'click #reset-password-submit1': 'execResetPasswordFn', //userResetPassModel1
                    'click #reset-password-submit2': 'execResetPasswordFn', //userResetPassModel2

上で宣言された各モデルは、イベントで宣言されたさまざまなメソッドに対応しています

4

1 に答える 1

4
  • 通常、モデル インスタンスは、メソッドoptionsへの引数でビューに渡す必要がありますinitialize

通常、モデルは、現在または最終的にデータベースのどこかに保存されるデータを表します。ここで、一時的なブラウザの状態を管理するためだけにモデルを作成したい場合がありますが、これは問題ありませんが、一般的なケースでは、ほとんどの読み取り/編集/削除ビューは、「新しいコメントを投稿する」などの主な目的でない限り、モデルを作成しません。形。したがって、通常、ビューにいくつかのモデルを表示する必要がある場合は、それらを更新して保存できるようにoptionsし、関数の引数でビューに入る必要がありinitializeます。

ただし、ビューに非常に多くのモデルが必要であり、システム内でそれらを気にするものが他にない場合は、作成中にモデルを作成し、 (ビュー インスタンス) とオフのinitializeプロパティとして直接保存します。this

より完全なコード サンプルを投稿していただければ、具体的な推奨事項を提示できますが、このままではLoginView1 つ以上のモデルが必要な場合は、設計上の問題が生じる可能性があります。

パート・ドゥ

すべての API エンドポイントにはモデルが必要だと思われます。Backbone.sync適切なurlオプションで使用する単一のモデル クラスのメソッドとしてそれらを実装するだけです。

var Model = Backbone.Model.extend({
    resendActivation: function () {
        return Backbone.sync.call('update', this, {url: fn_helper.restDomain()+ 'user/token/activation/new'});
    }
});

イベントを手動でトリガーする必要がある場合があり、API が何を返すかはわかりませんが、基本的にこれらはすべて単一のユーザー レコードを処理しており、単一のモデルで処理できます。

その他の無関係なヒント:

  • _.bindAll(this);//わざわざメソッドをリストする必要はありません
  • this.model.on('reset change', this.render);//一度に複数のイベントをバインド
  • 大多数の慣例による JavaScript は、lower_with_underscores ではなくキャメルケースを使用します
于 2013-03-06T03:22:31.390 に答える