2012-08-07 70 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布爾開關,