【问题标题】:Ember route has actionEmber 路线有动作
【发布时间】:2014-08-11 20:42:35
【问题描述】:

我正在为不同的路由构建一个 mixin 来处理保存操作。有时在保存后我想做额外的事情,所以我想将 saveCallback 操作发送回路由。

如果定义了动作,是否可以询问路由?或者:我可以检索路由的所有功能,以便我可以检查自己是否定义了路由?

代码混合

export default Ember.Mixin.create({
    actions: {
        save: {
            var self = this;

            this.get('model').save()
            .then(function(result) {
                //do stuff

                //Something like if(self.hasDefined('saveCallBack')) {
                    self.send('saveCallback')
                }
            }, function(errorReason) {
                //error handling
            });
        }
    }
}

我不能只触发发送操作,因为如果未定义操作,则会引发 Nothing handled the action 'saveCallback' 错误。

【问题讨论】:

  • 为什么不把'saveCallback'放在应用程序路由中。如果您的路由不处理该操作,则应用程序路由应该吞下它。
  • 这确实有效,但我不会说它很干净。只是在任何地方放置一个功能来防止错误不是我的一杯茶。不过,谢谢输入!

标签: ember.js


【解决方案1】:

我现在找不到问题,但我在某个时候在 Github 上阅读了一个关于添加 canSendAction(或类似的)函数的问题。现在,只需在你的 mixin 上定义相同的操作,然后让它冒泡。

export default Ember.Mixin.create({
    actions: {
        save: function() {
            var self = this;

            this.get('model').save().then(function() {
                self.send('saveCallback');
            });
        },

        saveCallback: function() {
            return true;
        }
    }
});

编辑:我很愚蠢。只需返回true,该操作就会在层次结构中冒泡,如果存在,它将被另一个操作捕获。

【讨论】:

  • 似乎完全按照我的意愿工作!只是一个小问题:似乎如果你有一个带有 saveCallBack 函数的 mixin 和一个带有 saveCallBack 函数的 Route(随 mixin 扩展),那么只有 Route 的功能会触发。如果只有我的 mixin 获得了 saveCallBack 函数,它就会在那里触发。这是故意行为吗?
  • 在这种情况下,您在单个对象上定义了两个 saveCallback 操作。要同时调用它们,您可能需要在每个开始时调用this._super()。这将确保两者都被触发,无论它们以什么顺序声明。这有点奇怪,但是冒泡动作和调用超级动作是不同的。
  • 谢谢你的解释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-04
  • 1970-01-01
  • 1970-01-01
  • 2014-04-18
  • 2014-06-06
  • 1970-01-01
  • 2017-07-06
相关资源
最近更新 更多