在显示属性之前格式化属性

时间:2013-02-15 12:53:33

标签: ember.js

Hello StackOverflow专家,

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

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

当我请求属性时(通过User.get)我想要恢复修改后的属性。

我认为通过使用另一个'helper'属性应该非常简单,例如formatted_mail,我将存储和检索格式化的值,但我想知道是否可以在没有其他模型属性的情况下完成这样的事情。

到目前为止,我有这个coffescript代码,但是在阅读属性时我总是得到'undefined',即使我之前设置过它,所以我怀疑Ember在任何地方都没有保存这个值:

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

感谢您的协助!

1 个答案:

答案 0 :(得分: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

您可以尝试in this JSFiddle