【问题标题】:EmberJS: Where to place a function for computed properties?EmberJS:在哪里放置计算属性的函数?
【发布时间】:2014-12-29 15:01:22
【问题描述】:

对于我的一些模型,我想使用相同的计算属性。但不是像这样在每个模型中编写相同的函数:

imageURL: function(){
  var path = '/images/',
      ext = ".jpg";
  return path + this.get('shortID') + ext;
}.property('shortID')

我想要这样的事情

imageURL: function(){
  return makeImageURL(this.get('shortID'));
}.property('shortID')

并且在某个地方有这个 makeImageURL 函数:

makeImageURL = function(shortID) {
  var path = '/images/',
    ext = ".jpg";
  return path + shortID + ext;
}

但是在哪里?顺便说一句,我正在使用 Ember-CLI。

【问题讨论】:

  • 如果帮助器为您工作,那很好,但您也可以编写自己的计算属性定义,这并不难,而且非常有用。请参阅 ember 文档中的相关部分。

标签: ember.js ember-data ember-cli


【解决方案1】:

使用ember-cli,您在终端中运行ember g util image,这将在app/utils/image 中创建一个新文件,您可以在其中放置图像的实用程序函数,如下所示:

export default {
  makeImageURL: function(shortID) {
    var path = '/images/',
      ext = ".jpg";
    return path + shortID + ext;
  }
};

你可以在你的模型中使用它

import { makeImageURL } from 'utils/image';

【讨论】:

  • 这也不错。我将用于其他目的。
【解决方案2】:

您是否考虑过让imageURL 成为组件内的计算属性?这样您就可以在需要时重复使用该组件。

另一种选择是创建一个 ember 车把助手,它根据传递给它的参数计算 imageURL。见here

【讨论】:

  • 用车把助手解决了这个问题。谢谢!
【解决方案3】:

另一种方法是使用Mixins

// app/mixins/image.js
import Ember from 'ember';

export default Ember.Mixin.create({
    imageURL: function(){
       var path = '/images/',
       ext = ".jpg";
       return path + this.get('shortID') + ext;
    }.property('shortID')
});

在某些模型中使用它,例如

// app/models/some-model.js
import DS from 'ember-data';
import ImageUrl from '../mixins/image';

export default DS.Model.extend(ImageUrl, {
    dummy: DS.attr('string')
});

【讨论】: