2013-02-15 3 views
1

эксперты Привет StackOverflow,форматирует свойство перед отображением его

Я хотел бы знать, если можно было бы использовать вычисляемые свойства ember.js', чтобы изменить значение свойства, прежде чем вернуться к тому, что объект запрашивает.

Представьте себе этот простой пример: У меня есть объект пользователя с почтовым свойством Когда я установить свойство, я хочу, чтобы адрес электронной почты, чтобы перейти от [email protected] к [email protected], то return it

Когда я запрашиваю свойство (через User.get), я хочу вернуть измененное свойство.

Я думаю, что это должно быть довольно просто, используя другое свойство «helper», например formatted_mail, где я буду хранить и извлекать форматированное значение, но мне интересно, можно ли сделать что-то подобное без дополнительных свойств модели.

До сих пор, у меня есть этот coffescript код, но я всегда получить «неопределенный» при чтении свойства, даже если я устанавливаю его раньше, так что я подозреваю, что значение не спасается от Ember везде:

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

Благодарим за помощь!

+0

Попробуйте с помощником руля, что-то вроде '{{formatEmail mail}}' – Manoharan

+0

Привет ManoHaran, это тоже похоже, но я чувствую, что эта модификация действительно привязана к логике моей модели, и я предпочел бы, чтобы это произошло на объект модели, а не на уровне представления. Спасибо за предложение, хотя! –

ответ

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.

+0

Привет, это работает как ожидалось. После некоторой отладки выяснилось, что я обращался к этому вычисленному свойству с использованием user.mail, а не user.get ('mail'), и это, конечно, не помогло. Спасибо за твою помощь! –

Смежные вопросы