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

时间:2013-09-17 12:49:04

标签: javascript ember.js

我有这个观点

  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未在视图方法中定义。

3 个答案:

答案 0 :(得分:23)

您可以将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选项,如示例所示。

工作demo

希望它有所帮助。

答案 1 :(得分:14)

要在同一个控制器中调用操作,您可以使用 <ion-content class="padding"> <ion-list> <ion-item > <div style="z-index: 1000;" ng-click="test()"> CLICK HERE</div> </ion-item> </ion-list> </ion-content>

angular.module('app', ['ionic']).controller('ctrl', function($scope){
  $scope.test = function(){
    alert('hello');
  };
})

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

this.send('nameOfAction', someParams);

答案 2 :(得分:12)

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