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

相关问题