组件上的计算值 setter
computed value setter on a component
参考:http://jsfiddle.net/xwLk2vb0/
Person = Ractive.extend({
template: "<p>the person named {{name}}</p>",
computed: {
name: {
get: function(){
if(typeof(this.get('_name'))=='undefined'){return "nameless"}
else{return this.get('_name')}
},
set: function(val){
this.set('_name',val)
}
}
}
});
people_model = new Ractive({
el: '#people_container',
template: '{{#people}}<person/>{{/}}',
data: {
people: [{},{},{}]
},
components :{person : Person}
});
people_model.set('people.0.name','Spongebob')
我不明白为什么最后一行不调用 'name' 计算属性上的 setter 然后更新呈现的模板。请有人提供任何见解。
提前致谢
简短的回答是计算属性 'owned' 由它们所在的组件决定;您无法通过他们的 parent 与他们互动。我写了一些关于为什么会这样 here - 它没有准确描述你的情况,但事实是 Person
组件的 name
和 [=它涉及的 object 的 11=] 属性。 name
被有效遮蔽了。
这是一件好事,因为它使代码更容易理解和推理 - 如果一个 object 填充了额外的值只是因为它们与组件上的计算属性一致(即每个 [= people
数组中的 30=] 会突然得到一个 name: 'nameless'
属性),你很容易陷入 brain-bending 的境地,试图找出一些数据来自哪里你的应用程序。
所以解决方案是使用 'proxy' 计算 属性 作为真实 name
属性 的访问器,像这样:http://jsfiddle.net/muoz44ec/ .请注意,我们明确地将组件内的 name
链接到 object.
人的 this.name
参考:http://jsfiddle.net/xwLk2vb0/
Person = Ractive.extend({
template: "<p>the person named {{name}}</p>",
computed: {
name: {
get: function(){
if(typeof(this.get('_name'))=='undefined'){return "nameless"}
else{return this.get('_name')}
},
set: function(val){
this.set('_name',val)
}
}
}
});
people_model = new Ractive({
el: '#people_container',
template: '{{#people}}<person/>{{/}}',
data: {
people: [{},{},{}]
},
components :{person : Person}
});
people_model.set('people.0.name','Spongebob')
我不明白为什么最后一行不调用 'name' 计算属性上的 setter 然后更新呈现的模板。请有人提供任何见解。
提前致谢
简短的回答是计算属性 'owned' 由它们所在的组件决定;您无法通过他们的 parent 与他们互动。我写了一些关于为什么会这样 here - 它没有准确描述你的情况,但事实是 Person
组件的 name
和 [=它涉及的 object 的 11=] 属性。 name
被有效遮蔽了。
这是一件好事,因为它使代码更容易理解和推理 - 如果一个 object 填充了额外的值只是因为它们与组件上的计算属性一致(即每个 [= people
数组中的 30=] 会突然得到一个 name: 'nameless'
属性),你很容易陷入 brain-bending 的境地,试图找出一些数据来自哪里你的应用程序。
所以解决方案是使用 'proxy' 计算 属性 作为真实 name
属性 的访问器,像这样:http://jsfiddle.net/muoz44ec/ .请注意,我们明确地将组件内的 name
链接到 object.
this.name