27

我有这个观点

  App.ApplicationView = Em.View.extend({
    templateName: 'application',

    actions: {
      myAction: function() {
        //
      }
    }
  });

假设我想从另一个视图方法(例如 didInsertElement)手动触发该操作,例如:

  App.ApplicationView = Em.View.extend({
    templateName: 'application',

    actions: {

      sidebarShowHome: function() {
        this.set('sidebarIsHome', true);
        this.set('sidebarIsNotifications', false);
        this.set('sidebarIsArchive', false);
      },
    },

    didInsertElement: function() {
      this.actions.sidebarShowHome();
    }
  });

我怎么能做到?this.actions 在视图方法中是未定义的。

4

3 回答 3

23

您可以将TargetActionSupportmixin 与this.triggerAction

App.ApplicationView = Ember.View.extend(Ember.TargetActionSupport, {
  templateName: 'application',
  actions: {
    myAction: function() {
      console.log('myAction');
    }
  },
  didInsertElement: function() {
    this.triggerAction({
      action:'myAction',
      target: this
    });
  }
});

默认情况下使用this.triggerAction()不带参数会将动作发送到控制器,但是如果您需要针对不同的目标定义target选项,如示例中所示。

工作演示

希望能帮助到你。

于 2013-09-17T13:00:19.823 回答
15

要在同一个控制器中调用一个动作,您可以使用send.

this.send('nameOfAction', someParams);

要从组件调用父控制器中的操作,请使用sendAction.

this.sendAction('nameOfAction', someParams);
于 2015-06-24T21:21:59.480 回答
12

triggerAction()仅当视图使用Ember.TargetActionSupportmixin时,该方法才存在。如果不是这种情况,请this.get('controller').send('action');改用。

于 2013-12-05T08:56:27.267 回答