1

一个简单的问题,我可以从 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();
        };
    }
});
4

1 回答 1

1

在 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:http: //jsbin.com/ILeguSO/4/edit

希望能帮助到你。

于 2013-10-08T10:15:49.360 回答