0

你怎麼罵多個模型在一個單一的視圖BackboneJS:如何分配多個模型在一個單一的視圖

常見的情況是,你創建一個骨架模型

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); 
     }, 
     ... 
    }); 

但是我在調​​用不同模型的單個視圖中有很多方法。目前我只是在事件方法中創建一個模型的實例。

那我想會是這樣

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); 
}, 

但這些良好做法的其他解決方案?還有什麼其他的方式來做到這一點。謝謝。

UPDATE 針對彼得,這是我的實際代碼

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 

上述聲明的每個模型對應於事件

聲明不同的方法

回答

3
  • 通常模型實例應該傳遞給意見options參數爲initialize方法。

通常模型表示當前或最終將數據存儲在某處的數據。現在,有時候你想創建一個模型來管理短暫的瀏覽器狀態,這很好,但常見的情況是大多數讀/編輯/刪除視圖不會創建模型,除非這是他們的主要目的,如「發佈新評論」形成。所以通常如果你的視圖必須顯示一些模型,允許它們可能被更新和保存,它們應該進入options參數的視圖initialize函數。但是,如果您的視圖確實需要這麼多模型,而您的系統中沒有其他人關心它們,只需在initialize期間創建它們,並將它們直接存儲爲this(您的視圖實例)的屬性,然後關閉它。

如果您發佈了更完整的代碼示例,我們可以給出具體的建議,但是看起來好像您的LoginView需要多個模型,您可能會忽略雜草設計 - 明智的。

部分德塞夫勒

OK,所以它看起來像你想每個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); //不打擾一次
  • 的JavaScript由絕大多數約定使用駝峯不lower_with_underscores掛牌方式進行
  • this.model.on('reset change', this.render); //綁定多個事件
+0

謝謝,我更新了我的問題。 – Barry 2013-03-06 03:48:45

相關問題