2012-08-07 75 views
0

我想使一个具有childViews计算属性,这取决于控制器的ContainerView。问题是,当控制器的内容发生变化时,该属性不会更新(当另一个从属属性发生更改时,它不会更新)。 请告诉我,我做错了......Ember ContainerView不更新计算的属性

例子: http://jsfiddle.net/frZ3a/5/

的Javascript:

App = Em.Application.create({}); 

App.controller = Em.ArrayController.create({ 
    reversed: false, 
    content: [], 
    init: function() { 
     var c = this; 
     function addContent() { 
      if (c.get('content').length < 10) { 
       c.get('content').push(c.get('content').length); 
       setTimeout(addContent, 1000); 
       console.log(c.get('content')); 
      } 
     } 

     addContent(); 
     return this._super(); 
    } 
}); 

App.TestView = Em.View.extend({ 
    templateName: 'single', 
    number: null   
}) 

Em.ContainerView.create({ 
    templateName: 'test', 
    tagName: 'div', 
    controller: App.controller, 
    reversedBinding: 'controller.reversed', 

    childViews: function() { 
     var result = this.get('controller.content').map(function(el) { 
      return App.TestView.extend({number: el}); 
     }); 
     if (this.get('reversed')) { 
      result.reverse(); 
     } 
     return result; 
    }.property('[email protected]', 'reversed') 

}).append(); 


Em.View.create({ 
    templateName: 'reverse', 
    controller: App.controller, 
    reversedBinding: 'controller.reversed', 

    reverseContent: function() { 
     this.set('reversed', !this.get('reversed')); 
    } 
}).append(); 

HTML:

<script type="text/x-handlebars" data-template-name="single"> 
    Single view: {{view.number}} 
</script> 

<script type="text/x-handlebars" data-template-name="reverse"> 
    <a {{action reverseContent}}>Reverse</a> 
</script> 

回答

0

Ť他的例子由于ContainerView而显得不起作用。当我修改它一点点: http://jsfiddle.net/frZ3a/18/

并将视图更改为一个普通的Ember.View,内容属性绑定到控制器的内容,它开始工作就好了。我想这是由于Ember.ContainerView的实现中的差异。

1

这里是一个(工作)改进版:http://jsfiddle.net/MikeAski/Qg3uW/

编辑

一些有趣的与你的细微差别...... :-)

  • 使用CollectionView代替each帮手,
  • 使用toggleProperty布尔开关,