如何以编程方式触发操作?

问题描述 投票:0回答:3

我有这个观点

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
是视图方法中的
undefined

javascript ember.js
3个回答
24
投票

您可以将

TargetActionSupport
mixin 与
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
选项,如示例中所示。

工作演示

希望有帮助。


15
投票

要在同一控制器中调用操作,您可以使用

send

this.send('nameOfAction', someParams);

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

sendAction

this.sendAction('nameOfAction', someParams);

12
投票

仅当视图使用

triggerAction()
mixin 时,
Ember.TargetActionSupport
方法才存在。如果不是这种情况,请使用
this.get('controller').send('action');
代替。

© www.soinside.com 2019 - 2024. All rights reserved.