1

您好 StackOverflow 专家,

我想知道是否可以使用 Ember.js 的计算属性来修改属性的值,然后再返回到请求它的任何对象。

想象一下这个简单的例子:我有一个带有邮件属性的用户对象当我设置属性时,我希望电子邮件地址从 first.last@example.com 更改为 first.last@anotherexample.com,然后返回它

当我请求该属性(通过 User.get )时,我想取回修改后的属性。

我认为通过使用另一个“帮助”属性(如 formatted_mail)应该非常简单,我将在其中存储和检索格式化值,但我想知道是否可以在没有其他模型属性的情况下完成类似的事情。

到目前为止,我有这个 coffescript 代码,但是在读取属性时我总是得到“未定义”,即使我之前设置了它,所以我怀疑 Ember 没有在任何地方保存该值:

mail: ( ( key, value ) ->
    if arguments.length == 1
        return this.get 'mail'
    else
        return value.split( '@' )[0] + '@anotherexample.com'
).property 'mail'

谢谢您的帮助!

4

1 回答 1

1

您已接近解决方案。

由于计算属性总是在 Ember 中默认缓存(您可以使用 禁用此行为.volatile()),您不必指定当arguments.length为 1 时要执行的操作,除非您想指定默认值。

所以这里应该是这样的:

App.User = Ember.Object.extend({
  mail: function(key, value) {
    if (arguments.length === 2) {
      return value.split('@')[0] + "@tieto.com";
    }
    return null;
  }.property()
});

return null只需指定默认值。

当您设置该mail属性时,它会缓存返回的值并始终返回它而不重新计算该属性。

请注意,您可以这样做只是因为该mail属性不依赖于其他属性。如果您使用 声明它.property('anotherProperty'),则该mail属性将在任何时间anoterProperty更改时重新计算。因此,在上面的示例中,它将重置为null.

您可以在这个 JSFiddle中尝试一下。

于 2013-02-15T13:43:56.697 回答