Ember.js 来自Mixin的参考控制器

Ember.js 来自Mixin的参考控制器,ember.js,Ember.js,一个简单的问题,我可以从ember中的mixin中获得对控制器的引用吗 我有一个ApplicationController,在这里我设置通过ember数据检索的值,我想从Mixin引用这些值。我找不到任何东西,所以我假设没有用于此的API App.Searchable = Ember.Mixin.create({ search: function () { if (this.isValid()) { var controller = this.co

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

我有一个ApplicationController,在这里我设置通过ember数据检索的值,我想从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();
        };
    }
});

在mixin中使用
this.controllerFor('application')
是不起作用的,因此,可以这样做的一种方法是将
ApplicationController
的引用存储在您创建的mixin中的局部变量中,以便以后可以轻松访问它

例如:

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:


希望能有所帮助。

在mixin中使用此.controller('application')不起作用,因此一种方法是将
ApplicationController
的引用存储在创建的mixin中的局部变量中,以便以后可以轻松访问它

例如:

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:


希望有帮助。

您能分享SearchController和Mixin的代码吗?这将更容易向您展示如何做到这一点。您可以共享来自SearchController和Mixin的代码吗?告诉你怎么做会更容易谢谢你!实际上,我进行了重组,以便将Mixin用于控制器而不是路由。但是你的帮助确实让我朝着更好的方向前进。非常感谢!实际上,我进行了重组,以便将Mixin用于控制器而不是路由。但你的帮助确实让我朝着更好的方向前进。