Ответ 1
Основная причина, по которой мы отменили это изменение, заключается в том, что он не позволяет переопределять свойства, которые определены в базовых классах как вычисленные свойства. Например, в Ember.View
свойство template
является вычисленным свойством:
template: Ember.computed(function(key, value) {
if (value !== undefined) { return value; }
var templateName = get(this, 'templateName'),
template = this.templateForName(templateName, 'template');
return template || get(this, 'defaultTemplate');
}).property('templateName').cacheable(),
При создании подкласса Ember.View
вы можете переопределить это определение с помощью явной функции шаблона:
Ember.View.create({ template: Ember.Handlebars.compile('...') });
Если вычисленное свойство не обрабатывает случай сеттера, эта попытка переопределить вычисленное свойство будет молчащим сбоем.
Если мы внесем это изменение, оно также вводит другие вопросы о том, должны ли наблюдатели запускать свойства, переданные в метод create
. Оба варианта можно реализовать, и для обоих подходов есть веские аргументы.
В преддверии 1.0 кажется разумным рассмотреть подход, который:
- изменить
create
на использование семантикиsetProperties
- добавить новый API (
override
илиcreateWithOverride
), который сохранит существующую семантику, если вы явно хотите переопределить существующие вычисленные свойства - подавлять наблюдателей для свойств, установленных из-за
create
(или не принимать) - найти способ обнаружения и предупреждения о попытках использовать API
create
с вычисленными свойствами, которые не реализуют сеттеры.
Мне нужно будет обсудить это больше и подумать о последствиях для существующих приложений, но это определенно заслуживает рассмотрения, так как это определенно довольно большая новость для новых разработчиков. Тот факт, что нам нужно было изменить поведение для ember-data
, - довольно хорошая подсказка, что что-то не так.