如何分开代码:我的控制器做了太多工作?

时间:2014-12-26 06:38:07

标签: javascript backbone.js marionette

以下是对以下代码的说明:

  1. 路由器决定调用哪种控制器方法
  2. 控制器获取模型
  3. controller使用模型
  4. 实例化各种视图
  5. controller实例化布局,将视图放入其中
  6. 控制器将布局放入app
  7. 控制器是否做了太多事情?我想好的方法应该是

    1. 路由器决定调用哪种控制器方法
    2. 控制器获取模型
    3. 控制器使用模型
    4. 实例化布局
    5. 控制器将布局放入应用程序。 控制器工作结束
    6. 初始化时的布局用模型实例化视图
    7. 问题:第二种方法更好吗? 如果是这样,怎么做[3。 5.好的方式]?

      代码也在jsfiddle

      ContactMgr.Router = Marionette.AppRouter.extend({
        appRoutes: {
          'contacts/:id'      : 'detail'
        }
      });
      
      ContactMgr.Controller = Marionette.Controller.extend({
          detail: function (id) {
            var promise = App.request('contact:entities', id);
            $.when(promise).done( function (contacts) {
              var _model = contacts.get(id);
      
              var contactView = new MyContactView({ model: _model });
              var sideView = new MySideView({ model: _model });
      
              var view = new MyLayout();
              // MyLayout has mainRegion, sideRegion
              view.on('show', function (v) {
                v.getRegion('mainRegion').show(contactView);
                v.getRegion('sideRegion').show(sideView);
              });
      
              App.getRegion('contentRegion').show(view);
              // App has contentRegion, other regions
      
            });// when done, end
          }// detail, end
      });
      

1 个答案:

答案 0 :(得分:0)

This可能就是答案。

ContactMgr.Controller = Marionette.Controller.extend({
  detail: function (id) {
    ...
    var _model = contacts.get(id);
    ...
    var view = new MyLayout({model: _model});
    App.getRegion('contentRegion').show(view);
  }
});

MyLayout = Marionette.Layout.extend({
    ...
    regions: {
      mainRegion: '#...',
      sideRegion: '#...'
    },
    contactView: null,
    sideView: null,
    onShow: function () {
      this.getRegion('mainRegion').show(this.contactView);
      this.getRegion('sideRegion').show(this.sideView);
    },
    initialize: function (opt) {
      var _model = opt.model;
      this.contactView = new Marionette.ItemView({ model: _model });
      this.sideView    = new Marionette.ItemView({ model: _model });
    }

});