2016-03-12 5 views
0

У меня есть демо-контроллер:Почему расчетные свойства ember выполняются только один раз в инспекторе ember?

import Ember from 'ember'; 

export default Ember.Controller.extend({ 
    firstName: 'Bob', 
    lastName: 'Smith', 

    emailAddress: '[email protected]', 

    fullName: Ember.computed('firstName', 'lastName', function() { 
    console.log('executed!'); 
    return `${this.get('firstName')} ${this.get('lastName')}`; 
    }), 

    actualEmailAddress: Ember.computed('emailAddress', function() { 
    console.log('actualEmailAddress function is called: ', this.get('emailAddress')); 
    }) 
}); 

Когда я бегу приложение на локальном хосте в браузере, я открываю уголек инспектор и запуск:

$E.get('actualEmailAddress')

Это возвращает:

actualEmailAddress function is called: [email protected]

Но когда я запускаю его во второй раз, я просто получаю undefined

То же самое, когда я бегу $E.get('fullName')

возвращает

executed! 
"Bob Smith" 

Но потом, когда я запускаю его снова возвращается только Bob Smith, не console.log

Почему это происходит?

Спасибо!

ответ

3

Вычисляемых свойства только получить вычислены по требованию, т.е. если его используются в шаблоне, как {{actualEmailAddress}} или используются в JS коды, this.get('actualEmailAddress');

Для исполнения вычислены свойств только получить пересчитывается, если зависимые значения свойств изменяются. Поэтому после первого вычисления результат кэшируется, и если вы попытаетесь снова получить доступ к CP, он просто вернет кешированное значение.

В первом случае для actualEmailAddress функция CP выполнена в первый раз, и вы зарегистрировали свой оператор, но вы не возвращаете значение, поэтому undefined возвращается неявно. Поэтому в следующий раз, когда вы вызываете CP, возвращается кеш-значение undefined.

Во втором случае для fullName снова функция запускается только в первый раз, и оператор регистрируется. Здесь, поскольку вы правильно вернули значение, в следующий раз, когда вы попытаетесь вызвать CP, вы получите значение кэшированного возврата в качестве ответа.

Чтобы заставить CP перепроверить, вам необходимо изменить значение зависимых свойств. Или используйте простой метод и вызовите это.

1

Вычислительные свойства: ленивый кэш. Каждый раз, когда они запускаются, они кэшируют возвращаемое значение и не перепропускают его, если одно из зависимых свойств не изменяется, и CP снова обращается к нему.

Это по дизайну. Кроме того, то, что вы видите, не изолировано от Ember Inspector - это справедливо для всех сред.

См. Мои answer to your other question для более подробной информации.

0

Вычисленное свойство преобразует объектный литерал с объектной функцией (объектами) объекта (-ов) объекта в свойство.

По умолчанию функция, поддерживающая вычисленное свойство, будет только под названием после, и результат будет сохранен в кэше. Вы можете указать различные свойства , от которых зависит вычисленное свойство. Это заставит результат кэширования пересчитать, если изменения будут изменены.

Я рекомендую использовать:

yourProperty: function() 
       { 
       //do something before send it back, example: 
       return `${this.get('yourRealProperty')}`; 
       }.property('yourRealProperty'), 

Это будет возвращать значение yourRealProperty когда вы invoque yourProperty.

reference 1 reference 1