2013-09-04 3 views
17

Я работаю над руководством ToDo для Ember.js, и я не могу понять, как работает этот контроллер. Что означает значение .property()? И как получилось, когда я удаляю «возвращаемое значение»; линейная функциональность остается прежней. Если бы кто-то мог точно объяснить, что здесь происходит, это было бы здорово.Что делает .property()? in function() {}. property()

Ссылка на руководство: http://emberjs.com/guides/getting-started/marking-a-model-as-complete-incomplete/

+2

http://emberjs.com/guides/object-model/computed-properties/ –

+1

@RUJordan Я до сих пор не понимаю, почему вам нужно .Property Свойство() в этом коде 'fullName: function() { return this.get ('firstName') + '' + this.get ('lastName'); } .property ('firstName', 'lastName') 'все еще кажется лишним иметь как возврат, так и .property() – Wilfred

+0

Также в этом фрагменте кода' App.SongsController = Ember.ArrayController.extend ({longSongCount : function() { var longSongs = this.filter (функция (песня) { возвращение song.get ('duration')> 30; }); возвращение longSongs.get ('length'); } .property ('@ each.duration') }); 'Вы уже возвращаете длину longSongs, так зачем вам нужно .property ('@ each.duration')? – Wilfred

ответ

18

В JavaScript единственный способ сделать некоторую обработку при получении или установки одно свойство используется Object.defineProperty:

Object.defineProperty(person, "b", { 
    get : function() { 
    return person.firstName + ' ' + person.surname; 
    }, 
    set : function(newValue) { 
    var names = newValue.split(' '); 
    person.firsname = names[0]; 
    person.surname = names[1]; 
    }, 
    enumerable : true, 
    configurable : true 
}); 

Но есть некоторые недостатки:

  • Не кросс-браузер
  • Другими словами, не имеет привязки, если изменения firstname или surname, зависимое свойство fullname не изменяется.
  • Вызов person.name когда person неопределен, сделать ошибку будет сгенерировано
  • не представляется возможным вызвать наблюдателей, ни без дополнительного кода и осознает depency иерархия: firstname зависит от fullname, и это может быть зависимость от других свойства arghhh!

Из-за этого Ember имеет концепцию «собственность», называемую computed property.

Он может быть объявлен 2-мя способами:

foo: Ember.computed(function({ 
    ... 
}).property(dependent keys); 

или при использовании (по умолчанию) Ember.ENV.EXTEND_PROTOTYPES = true:

foo: function() { 
    ... 
}.property(dependent keys); 

property(dependent keys), необходима, потому что сказать Ember, что это Недвижимость Болгария Недвижимость что при изменении изменится свойство.

fullname: function(key, value) { 
    // setter 
    if (value !== undefined) { 
    var names = value.split(' '); 
    this.set('firstname', names[0]); 
    this.set('surname', names[1]); 
    } 
    // always return the complete result, so nexts calls to this.get('fullname') will return the cached value 
    return this.get('firstname') + ' ' + this.get('surname'); 
}.property('firstname', 'surname') 

Используя это, у вас есть преимущество:

  • при изменении firstname или surname на новое значение, fullname изменяется.
  • Перед изменением значения запускаются beforeObserves, а после изменения значения запускаются observes.
  • Обновлен любой шаблон, ссылающийся на некоторое свойство
  • Более одного вызова person.get ('firstname') вернет кешированное значение, сохранив обработку. Вы можете отключить его, используя .property(..).volatile()
  • Избегайте использования null или undefined ошибок при обращении к нулевым объектам, таким как: controller.get('person.dog.name') возвращает undefined, если человек или собака не определены.

Я надеюсь, что это помогает

+0

Хорошо, спасибо! Я начинаю понимать это лучше. Итак, как в примере в исходном вопросе находится зависимый ключ '' model.isCompleted'', а не только '' isCompleted''? – Wilfred

+0

Путаница заключается в том, что имя почти то же самое, но относится к двум различным свойствам. 'isCompleted' зависит от' model.isCompleted', и если мы используем 'isCompleted: function() {...} .property ('isCompleted')', будет ссылаться на само свойство. –

5

.property() отмечает функцию как вычисленной собственности так, что его можно использовать в шаблонах, например, последовательным образом. Это свойство JavaScript foo? Или это функция foo()? Вычислимые свойства решают эту проблему на всех платформах.

Поля и пути, переданные в качестве аргументов, являются зависимыми клавишами . Все вычисляемые свойства в Ember кэшируются по умолчанию. Чтобы узнать, когда вычисляемое свойство нужно перечислить, Ember должен знать, с какими свойствами и путями он зависит. В примере гида вычисленное свойство fullName зависит от firstName и lastName; Эмбер должен знать, что он может перепроверить fullName, когда любой из них изменится. (Примечание: вы можете отключить кеширование с помощью .property().volatile().)

Пожалуйста, ознакомьтесь с руководствами. Все это задокументировано.

+0

Итак, в шаблоне есть '

  • {{input type =" checkbox "checked = isCompleted class =" toggle "}}
  • 'и единственная причина, по которой это работает, потому что isCompleted имеет .property() в конце? – Wilfred

    +0

    Отчасти, да. И зависимые ключи - это то, что позволяет Ember поддерживать его в актуальном состоянии. –

    +0

    раздел вычисленных свойств в 2.16.0 не содержит ничего в '.property()' хотя https://guides.emberjs.com/v2.16.0/object-model/computed-properties/ –