【问题标题】:Accessing an Ember.Mixin within a custom handlebars helper在自定义车把助手中访问 Ember.Mixin
【发布时间】:2014-04-23 16:29:57
【问题描述】:

是否有一种优雅的方式在自定义车把助手中使用 Ember.Mixin 对象中定义的方法?

例如,在我的情况下,我有一个 mixin,App.Format,其中包含许多用于格式化数字、日期等的不同方法,我想让其中一些方法通过自定义帮助程序直接从模板访问(例如{{formatNumber 450324}})。我不只是将方法实现直接放在帮助程序而不是 mixin 中的原因是我还需要这些方法在控制器、视图等中可用。而且为了保持我的代码 DRY,我绝对不希望在 mixin 和 helpers 中有重复的代码。

是否有任何规范的“修饰”方式来实现这一点,还是我只是以完全错误的方式思考它?

编辑:这是一个 jsbin 来更好地说明问题:

http://emberjs.jsbin.com/wunug/1/edit?html,js,output(查看第 33-37 行)

【问题讨论】:

  • 我会创建一个使用你的 mixin 的助手。文档可在emberjs.com/guides/templates/writing-helpers 获得
  • @ppcano 对,这就是我试图从我用Ember.Handlebars.helper() 创建的自定义助手访问我的mixin。我遇到的问题是我应该如何从辅助函数中访问/实例化 mixin,以便我可以使用它的方法。
  • App.Format 在您的帮助模块中不可用吗?那样的话,就是你的模块加载器结构有问题,不然写个例子(emberjs.jsbin.com)更好的帮助你。
  • @ppcano 我添加了一个 jsbin 以更好地表达我的意思。对象App.Format 本身已定义并可通过辅助函数使用,我只是不知道如何访问它的方法,即我不能只通过var format = new App.Format()var format = App.Format.create() 创建它的实例。

标签: ember.js handlebars.js


【解决方案1】:

Mixin.apply 方法完成了这项工作。

Ember.Handlebars.helper('formatNumber', function(num, decimals) {
  var format = App.Format.apply({});
  return format.formatNumber(num, decimals || 2);
});

【讨论】:

  • 啊,完美!实际上,当我浏览 api 文档时,我确实浏览了 apply() 方法,但我想它缺乏描述导致我忽略了它。 :)
  • 问题:这不会在每次调用助手时实例化 Mixin 吗?这通常并不理想。
【解决方案2】:

我正在使用 Ember 2.12,这就是我为我工作的。希望这可以帮助某人。

创建一个名为 formatter 的新 mixin:

../mixins/formatters.js

    import Ember from 'ember';

    export default Ember.Mixin.create({
        shortDate: function(date) {
            return `Date should be formatted: ${date}`;
        }
    });

创建一个新的助手来导入上面的 mixin 并使用它。

../helpers/short-date.js

    import Ember from 'ember';
    import FormatDateMixin from '../mixins/formatters';

    export default Ember.Helper.extend(FormatDateMixin,  {
      compute: function(params /*, hash*/) {
        return this.shortDate(params);
      }
    });

在模板 *.hbs 文件中,使用如下帮助器:

    {{short-date today}}           

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多