如何将ArrayController.content绑定到视图,以便根据ArrayController中的对象绘制画布。
jsFiddle -样本代码控制器中值的绑定正在工作,但对content.values无效。
问题1:是概念上的失败吗?我没能找到我的问题的详细信息。对于ObjectController来说,这是可行的,但对ArrayController则不然。
问题2:是最好的解决方案,更新视图,如果Object.values (e.q )。faceColor)变化?
Html
<script type="text/x-handlebars">
<h1>each</h1>
{{#each App.andonController}}
{{view "App.AndonView"}}
{{faceColor}} {{emotionType}}
{{/each}}
</script>对象
App.Andon = Ember.Object.extend({
emotionType: '',
faceColor: '',
});视点
我想在画布vor ArrayController中的每个对象中画一个元素
App.AndonView = Ember.View.extend({
tagName: "canvas",
attributeBindings: ['height', 'width'],
height: 100,
width: 100,
controllerBinding:'App.andonController.content',
faceColorBinding: 'content.faceColor',
emotionTypeBinding: 'content.emotionType',
didInsertElement: function(){
this.drawSmiley();
},
arrayDidChange: function(){
this.drawSmiley();
},
degreesToRadians : function(degrees) {...},
drawSmiley: function(){
...
var faceColor = null;
try {
faceColor = this.get('faceColor');
//alert(faceColor);
} catch (e) {
alert('faceColer is empty')
}
...
}
});主计长
App.andonController = Em.ArrayController.create({
content: [
App.Andon.create(
{
emotionType: 'happy',
faceColor: '#00ff00'
}),
App.Andon.create(
{
emotionType: 'sad',
faceColor: '#665sd'
}
)],
})发布于 2013-03-18 17:38:00
我将对其进行一些重构,以使用itemController功能,它直接出现在each和ArrayController上。
首先,我将您的数组控制器从andonController更改为andonsController。复数有助于清楚地表明,它管理的是andons集合,而不是单个对象。
然后,我将创建第二个控制器来管理单个的andon对象:
App.AndonController = Ember.ObjectController.extend()现在,在您的循环中,您可以代替
{{#each App.andonsController itemController="App.AndonController"}}
{{view "App.AndonView"}}
{{faceColor}} {{emotionType}}
{{/each}} App.AndonController的一个实例(现在是一个ObjectController,这意味着它将透明地传递到其对属性的内容调用,包括绑定和计算属性‘)将为循环中的每个项创建一个实例,而且由于视图的控制器是它的上下文,所以您不需要将任何内容添加到路径中,而subView将自动将controller作为其上下文。
我用你的JSFiddle来说明:
http://jsfiddle.net/H2zPk/
对于在视图中使用context属性,我更不确定。这主要是供模板使用的,而在内部使用它可能会导致以后违背行为的期望,例如,如果您尝试将它包括在context不是AndonController的某个地方。相反,我会将像content这样的属性(<-注意拼写更改)绑定到给定用途的已知有效路径,并访问该内部变量的属性。(我也不会绑定context属性,我认为这是一个反模式)。
通常,如果您依赖于外部设置的属性,并且在某些情况下可能没有设置,或者不一定指向您期望的对象,那么我将避免在类中直接使用它,而是定义绑定。(我特别指的是controller或context这样的内置属性,它们的行为可能会有所不同。您自己的属性可以定义合理的缺省值,并以已知的行为记录在案,当然,在视图中直接使用是安全的)。您不仅避免依赖在所有情况下都可能不相同的行为(或者更糟糕的是,行为被认为是私有的或内部的,并可能在将来发生变化),然后您可以用计算的属性替换您的内部属性,或者只是将其绑定到您想要的任何地方,而不需要破坏Ember,也不需要更新您的引用。
发布于 2013-03-18 09:38:23
通过使用contextBinding,我在这个问题上取得了一些成功。您可以将模板更改为类似的内容。
{{#each andon in App.andonController}}
{{view "App.AndonView" contextBinding="andon"}}
{{faceColor}} {{emotionType}}
{{/each}}然后将视图中的每个值取为
this.get('context.faceColor')诸若此类。我能从你的小提琴里得到快乐的表情。
http://jsfiddle.net/gcLft/2/
https://stackoverflow.com/questions/15472294
复制相似问题