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'
感谢您的协助!
答案 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。