2013-10-08 69 views
1

一个简单的问题,我可以从一个mixin的ember中获得对控制器的引用吗?Mixin的参考控制器

我有一个ApplicationController,我设置值通过ember-data检索,我想从一个Mixin引用这些值。我找不到任何东西,所以我的假设是没有API?

App.Searchable = Ember.Mixin.create({ 
    search: function() { 
     if (this.isValid()) { 
      var controller = this.controllerFor('application'); 
      return controller.getProperties('fromDate', 'toDate', 'brokers', 'locations'); 
     } 
     else 
      return this.isInvalid; 
    }, 
    isValid: function() { 
     var controller = this.controllerFor('search'); 
     var fromDate = moment(this.get('fromDate'), 'YYYY-MM-DD'); 
     var toDate = moment(this.get('toDate'), 'YYYY-MM-DD'); 
     return moment(fromDate).isBefore(toDate) || moment(fromDate).isSame(toDate); 
    }, 
    isInvalid: function() { 
     $("#date-range-error").show(); 
    } 
}); 

App.PnlRoute = Ember.Route.extend(App.Searchable, { 
    model: function() { 
     return this.store.find('pnl', this.search()); 
    }, 
    renderTemplate: function() { 
     this.render('pnl', { 
      into: 'application', 
      outlet: 'data', 
      controller: 'pnl' 
     }); 
    }, 
    actions: { 
     filter: function() { 
      this.controllerFor('pnl').set('model', this.store.find('pnl', this.search())); 
     } 
    } 
}); 

App.ApplicationController = Ember.ArrayController.extend({ 
    title: 'Pnl', 
    fromDate: null, 
    toDate: null, 
    locations: [], 
    ccyPairs: [], 
    brokers: [], 
    init: function() { 
     var self = this; 
     this.store.find('date').then(function (result) { 
      var date = result.objectAt(0); 
      self.set('fromDate', date.get('from')); 
      self.set('toDate', date.get('to')); 
     }), function (error) { 
      $("#date-init-error").show(); 
     }; 
    } 
}); 
+0

你可以分享你的SearchController和Mixin的代码吗?它会更容易告诉你如何做到这一点 – intuitivepixel

回答

1

使用this.controllerFor('application')的混入里面不起作用,因此,你能做到这一点的方法之一是存储在您创建的Mixin一个局部变量的ApplicationController的参考,所以你以后可以访问它容易。

例如:

App.ApplicationController = Ember.ObjectController.extend(); 

App.Searchable = Ember.Mixin.create({ 
    ctrl: null, 
    search: function() { 
    console.log(this.get('ctrl')); 
    } 
}); 

App.ApplicationRoute = Ember.Route.extend(App.Searchable, { 
    activate: function() { 
    this.set('ctrl', this.controllerFor('application')); 
    this.search(); 
    } 
}); 

例jsbin:http://jsbin.com/ILeguSO/4/edit

希望它能帮助。

+0

非常感谢!事实上,我重组后,以便使用Mixin代替路线控制器。但你的帮助肯定会让我走向更好的方向。 – 1174