Я использую PolymerJS.Каковы нюансы наблюдения «собственности», которая фактически получена геттером?
Похоже на наблюдение за свойством, полученным с помощью getter
работ.
Например, следующий код, кажется, работает:
<div>Direct binding to property: {{internalData.value}}</div>
<div>Binding to computed value: {{computedValue}}</div>
<div>Binding to observed value: {{observedValue}}</div>
<script>
var externalData = {
get value() {
return 'static value';
}
};
Polymer('my-element', {
internalData: externalData,
computed: {
computedValue: 'internalData.value'
},
observe: {
'internalData.value': 'valueChanged'
},
valueChanged: function() {
this.observedValue = this.internalData.value;
}
});
</script>
Однако, что если мой getter
определяет что-то более сложное? Я обнаружил, что если getter
возвращает новое значение при каждом вызове, то попытка такого привязки приведет к сбою моей вкладки в браузере (это Chrome 39, поэтому я считаю, что это результат наблюдения за собственным объектом).
Например:
var externalData = {
get changingValue() {
return Math.random();
}
}
Почему это? Чего еще я должен беспокоиться, если я попытаюсь использовать этот шаблон?
Вот более-полный изношенном различных перестановок задачи:
http://jsbin.com/reder/28/edit?html,output
Заметим, кстати, что этот вопрос может придумать чаще, чем вы думаете. Если один возвращает объект из добытчика, это легко случайно создать новую на каждый доступ, например .:
var externalData = {
get changingValue() {
return { foo: 'bar' };
}
}
Я думаю, что у вашего Полимера отсутствует закрытие ')' –
Спасибо, Стерлинг. Измененный. –
Я бы предположил, что ваш доступ к 'this.internalData.changingValue' внутри слушателя' changeValueChanged' вызывает генерирование нового значения, что вызывает бесконечный цикл изменений. Доступ к данным и изменение данных всегда совпадают, поэтому, если изменение данных приведет к доступу к данным, будет бесконечный цикл. Если функция 'changeValueChanged' не имеет доступа к' changeValue', кажется, что нет бесконечного цикла. Однако это не похоже на всю историю, потому что доступ к 'changeValue' с консоли не запускает прослушиватель изменений. – apsillers