2013-10-29 39 views
2

所以,這就是我的模型看起來像(由夾具數據表示):Ember.js:在當前數組元素的計算性能

var posts = [{ 
    id: 'b026324c6904b2a9', 
    title: "My new front door", 
    author: { name: "Matthieu" }, 
    date: new Date('2013-10-28T12:19:30.789'), 
    status: 'new', 
    hidden_message: "hidden1" 
}, { 
    id: '26ab0db90d72e28a', 
    title: "Best pizza in town", 
    author: { name: "Harry" }, 
    date: new Date('2013-10-28T12:19:30.789'), 
    status: '', 
    hidden_message: "hidden2" 
}, { 
    id: '6d7fce9fee471194', 
    title: "Skateboard dreamland", 
    author: { name: "Matthieu" }, 
    date: new Date('2013-10-28T12:19:30.789'), 
    status: 'solved', 
    hidden_message: "hidden3" 
}, { 
    id: '48a24b70a0b37653', 
    title: "my house looks like a pumpkin", 
    author: { name: "Harry" }, 
    date: new Date('2013-10-28T12:19:30.789'), 
    status: '', 
    hidden_message: "hidden4" 
}]; 

我的路線:

App.IndexRoute = Ember.Route.extend({ 
    model: function() { 
     return posts; 
    } 
}); 

而且,我如果相應的帖子是新的,則希望能夠在模板中顯示某個HTML片段,如果解決了該問題,則顯示不同的HTML片段,如果狀態爲空,則不顯示。在我看來,似乎最好的方法是使用{{#if}}幫助程序,但不會執行相等比較,它只能使用布爾變量。所以,我希望做這樣的事情:

App.IndexController = Ember.ArrayController.extend({ 

    isNew: function(val) { 

     if(this.get('currentitem.status') === 'new') { 
      return true; 
     } 

     return false; 

    }.property('isNew') 

}); 

但我不能找出如何選擇項目正在模板由{{#each}}當前訪問。這甚至是可能的,如果是的話,我該怎麼做(或類似的)?

謝謝大家!

回答

3

要做到這一點的正確方法是創建一個itemcontroller,通過爲您的集合中的每個項目提供一個控制器來幫助您。

App.IndexController = Ember.ArrayController.extend({ 
    itemController: "PostItem", 
}); 

App.PostItemController = Ember.ObjectController.extend({ 
    isNew: function() { 
     if(this.get('status') === 'new') { 
      return true; 
     } 
     return false; 
    }.property('status') 
}); 

然後在你的車把模板,你可以只調用在{{#each}} -context {{isNew}}

我已經提出了一個工作小提琴,你可以測試一下英寸

http://jsfiddle.net/LordDaimos/v8NR3/1/

+1

這更接近於我一直在尋找,似乎是一個更優雅的解決方案。謝謝! – SlEePlEs5

1

最好的辦法可能是包裹每個崗位在具有是否新款方法,像這樣的對象:

var postObject = Ember.Object.extend({ 
    isNew: function() { 

     if(this.get('status') === 'new') { 
      return true; 
     } 

     return false; 

    }.property('status') 
}); 

App.IndexRoute = Ember.Route.extend({ 
    model: function() { 
     return posts.map(function(post){ 
      return postObject.create(post); 
     }); 
    } 
}); 

這種方式,你可以在每一個職位查詢。

+0

完美工作,謝謝! – SlEePlEs5

+1

儘管如此,他將從他早期的東西中創建新的對象,所以如果他更新新的對象,他們將不會反射回原來的東西(這可能也會用在其他地方) –