首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >contentBinding介于Ember.ArrayController和Ember.View之间[成员-1.0.0-rc.1.js]

contentBinding介于Ember.ArrayController和Ember.View之间[成员-1.0.0-rc.1.js]
EN

Stack Overflow用户
提问于 2013-03-18 08:18:29
回答 2查看 2.4K关注 0票数 1

如何将ArrayController.content绑定到视图,以便根据ArrayController中的对象绘制画布。

jsFiddle -样本代码控制器中值的绑定正在工作,但对content.values无效。

问题1:是概念上的失败吗?我没能找到我的问题的详细信息。对于ObjectController来说,这是可行的,但对ArrayController则不然。

问题2:是最好的解决方案,更新视图,如果Object.values (e.q )。faceColor)变化?

Html

代码语言:javascript
运行
复制
<script type="text/x-handlebars">

<h1>each</h1>
{{#each App.andonController}}
    {{view "App.AndonView"}}
    {{faceColor}} {{emotionType}}
{{/each}}   

</script>

对象

代码语言:javascript
运行
复制
App.Andon = Ember.Object.extend({
    emotionType: '',
    faceColor: '',
});

视点

我想在画布vor ArrayController中的每个对象中画一个元素

代码语言:javascript
运行
复制
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')
        } 
        ...
    } 
});

主计长

代码语言:javascript
运行
复制
App.andonController = Em.ArrayController.create({

    content: [

      App.Andon.create( 
      {
        emotionType: 'happy',
        faceColor: '#00ff00'
      }), 
      App.Andon.create( 
          {
              emotionType: 'sad',
              faceColor: '#665sd'
      } 
   )],

})
EN

回答 2

Stack Overflow用户

发布于 2013-03-18 17:38:00

我将对其进行一些重构,以使用itemController功能,它直接出现在eachArrayController上。

首先,我将您的数组控制器从andonController更改为andonsController。复数有助于清楚地表明,它管理的是andons集合,而不是单个对象。

然后,我将创建第二个控制器来管理单个的andon对象:

代码语言:javascript
运行
复制
App.AndonController = Ember.ObjectController.extend()

现在,在您的循环中,您可以代替

代码语言:javascript
运行
复制
{{#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属性,我认为这是一个反模式)。

通常,如果您依赖于外部设置的属性,并且在某些情况下可能没有设置,或者不一定指向您期望的对象,那么我将避免在类中直接使用它,而是定义绑定。(我特别指的是controllercontext这样的内置属性,它们的行为可能会有所不同。您自己的属性可以定义合理的缺省值,并以已知的行为记录在案,当然,在视图中直接使用是安全的)。您不仅避免依赖在所有情况下都可能不相同的行为(或者更糟糕的是,行为被认为是私有的或内部的,并可能在将来发生变化),然后您可以用计算的属性替换您的内部属性,或者只是将其绑定到您想要的任何地方,而不需要破坏Ember,也不需要更新您的引用。

票数 3
EN

Stack Overflow用户

发布于 2013-03-18 09:38:23

通过使用contextBinding,我在这个问题上取得了一些成功。您可以将模板更改为类似的内容。

代码语言:javascript
运行
复制
{{#each andon in App.andonController}}
    {{view "App.AndonView" contextBinding="andon"}}
    {{faceColor}} {{emotionType}}
{{/each}}

然后将视图中的每个值取为

代码语言:javascript
运行
复制
this.get('context.faceColor')

诸若此类。我能从你的小提琴里得到快乐的表情。

http://jsfiddle.net/gcLft/2/

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15472294

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档