【问题标题】:Ember design pattern余烬设计模式
【发布时间】:2013-06-07 18:30:46
【问题描述】:

我正在开发一个基于 ember 的项目,但我不确定设计。 我有一个所有其他控制器都在扩展的应用程序控制器:

基础控制器

App.ApplicationController = Ember.Controller.extend({
    needs:['userNav'],
    dateNavSelected : '',
    currentSleeperImg:AppStateManager.get('currentSleeperImg'),
    currentSleeperName:AppStateManager.get('currentSleeperName'),        
    didSleeperChange:false,
    logout: function(){
        AppStateManager.transitionTo('loggedOutState');
        this.transitionToRoute('signin');
    },
    selectSleeper: function(sleeper){ //Gets the sleeper change from the menu
        var currSleeper = AppStateManager.get('currentSleeperObj');
        if(!currSleeper || (currSleeper && sleeper.get('id') != currSleeper.get('id'))){
            AppStateManager.set('currentSleeperImg', sleeper.get('sleeper_avatar'));
            AppStateManager.set('currentSleeperName', sleeper.get('sleeper_name'));
            AppStateManager.set('currentSleeperObj', sleeper );
            this.set('currentSleeperImg' , sleeper.get('sleeper_avatar'));
            this.set('currentSleeperName' , sleeper.get('sleeper_name'));
            this.set('didSleeperChange', true);
        }else{
            this.set('didSleeperChange', false);
        }
    }
});

儿童控制器

App.LastNightSummaryController = App.ApplicationController.extend({        
    pageTitle: moment().subtract('days', 1).format("MMM D"),
    active:'last-night-summary',        
    selectSleeper: function(sleeper){ //Gets the sleeper change from the menu
        this._super(sleeper);   
        if(this.get('didSleeperChange')){
            this.set('content', App.SleepData.find({id:sleeper.get('id'), sleeper:sleeper}));
        }    
    }    
});

是一个好的模式吗?

【问题讨论】:

  • IMO 严格 NO 为每个 Controller 扩展 applicationController...应该在应用程序级别处理的属性应该放在那里...每个其他实体都应该有自己的 Controller 来处理该特定状态...
  • 我通常会做类似的事情,但当然不是ApplicationController。你可以这样做,但扩展 ObjectControllerArrayController 代替。

标签: javascript ember.js


【解决方案1】:

不,您应该从基本控制器扩展。应用程序控制器已经有责任跟踪应用程序状态。如果您出于任何原因需要访问应用程序控制器,请在代码中使用 @controllerFor("application")。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多