저는 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
이 새로운 값을 반환하면 이러한 바인딩을 시도하면 브라우저 탭이 손상됩니다 (크롬 39이므로 기본 객체 관찰의 결과라고 생각합니다). 예를 들어
:
var externalData = {
get changingValue() {
return Math.random();
}
}
는 이유는 무엇입니까? 이 패턴을 시도하면 또 무엇을 염려해야합니까? 이 문제가 더 일반적으로 당신이 생각하는 것보다 올 수 있다고,
http://jsbin.com/reder/28/edit?html,output
주, BTW :
는 여기에 문제의 다른 순열보다 완성 개요입니다. 하나는 게터에서 개체를 반환하는 경우 : 실수로 각 액세스에 새로 만들
var externalData = {
get changingValue() {
return { foo: 'bar' };
}
}
귀하의 폴리머가 폐액 처리를하지 못했다고 생각합니다.')' –
고맙습니다, 스털링. 수정 됨. –
'changingValueChanged' 리스너 내부에서'this.internalData.changingValue'에 대한 액세스가 변경 이벤트의 무한 루프를 야기하는 새로운 값을 생성하게한다고 생각합니다. 데이터 액세스 및 데이터 변경은 항상 일치하므로 데이터를 변경하면 데이터에 액세스 할 때 무한 루프가 발생합니다. 'changingValueChanged' 함수가'changingValue'에 접근하지 않으면, 무한 루프가없는 것 같습니다. 그러나 콘솔에서'changingValue'에 액세스하면 변경 리스너가 실행되지 않기 때문에 전체 스토리가 아닌 것 같습니다. – apsillers