包装控制器操作时使用tryInvoke

时间:2013-10-31 11:19:24

标签: ember.js

最新指南声明将控制器操作包装在

actions: {
  loadMore: function() {}
}

当我这样做时,我之前必须在控制器上触发操作的代码不再有效:

Ember.tryInvoke(view.get('controller'), 'loadMore');

让这种情况再次发生的正确方法是什么?

修改

使用tryInvoke的完整代码:

  didInsertElement: function() {
    'use strict';

    var view = this;
    this.$().bind('inview', function(event, isInView, visiblePartX, visiblePartY) {
      if (isInView) {
        Ember.tryInvoke(view.get('controller'), 'loadMore');
      }
    });
  },

2 个答案:

答案 0 :(得分:0)

您可以使用Ember.ViewTargetActionSupport,并将action属性设置为您想要的操作名称,在这种情况下loadMore。使用triggerAction将发送操作。

因为jquery事件与ember run循环分离,所以我将triggerAction包装在Ember.run中。

App.YourView = Ember.View.extend(Ember.ViewTargetActionSupport, {
  action: 'loadMore',
  didInsertElement: function() {
    'use strict';

    var view = this;
    this.$().bind('inview', function(event, isInView, visiblePartX, visiblePartY) {
      if (isInView) {
        Ember.run(function() {
          view.triggerAction();
        });        
      }
    });
  },
});

答案 1 :(得分:0)

你确定你的控制器正确吗?根据几个月前在Ember 1.2中提交的一个提交,现在可以从一个视图访问控制器作为“targetObject”而不是“controller”:

https://github.com/emberjs/ember.js/commit/326af5a9c88df76f5effe11156a07b64c8b178a3#packages/ember-handlebars/lib/controls/text_support.js