Ember.js CollectionView订单

Ili*_*oly 4 javascript ember.js

我有一个ArrayController定期更新的.它有一个sorted计算属性,可以保持秩序.我正在尝试使用CollectionViewcontent绑定到sorted属性的属性,但它不会以正确的顺序呈现它们.演示

我显然做出了错误的假设,即在contentchildViews财产之间保持秩序.这样做的正确方法是什么?

把手:

<script type="text/x-handlebars" data-template-name="item">
    id {{view.content.id}}
</script>

<script type="text/x-handlebars">
    <ul>
     {{collection
        contentBinding="App.itemController.sorted"
        itemViewClass="App.ItemView"
    }} 
    </ul>        
</script>
Run Code Online (Sandbox Code Playgroud)

JavaScript:

?App = Ember.Application.create({
    ready: function(){

        // add a new object with a random id
        // every second
        setInterval(function(){

            var id = Math.round(Math.random() * 100),
                obj = Em.Object.create({ id: id });
            App.itemController.pushObject(obj);

        }, 1000);

    }
});

// Collection Item View
App.ItemView = Em.View.extend({
    tagName: "li",
    templateName: "item"
});

App.itemController = Em.ArrayController.create({

    // random order
    content: Em.A([
        Em.Object.create({ id: 5 }),
        Em.Object.create({ id: 3 }),
        Em.Object.create({ id: 10 }),
        Em.Object.create({ id: 6 }),
        Em.Object.create({ id: 1 }),
        Em.Object.create({ id: 2 }),
        Em.Object.create({ id: 100 }),
    ]),

    // filtered content
    sorted: function(){
        return this.get('content').sort(function(a,b){
            return a.get('id') - b.get('id');
        });
    }.property("@each")

});
Run Code Online (Sandbox Code Playgroud)

pan*_*atz 7

为了完整性@ sly7_7的正确答案,这里有一个版本CollectionView,请参阅http://jsfiddle.net/pangratz666/ctPAA/.

把手:

<script type="text/x-handlebars">
    {{collection
        tagName="ul"
        contentBinding="App.itemController"
        itemViewClass="App.ItemView" }} 
</script>
Run Code Online (Sandbox Code Playgroud)

JavaScript:

App.itemController = Em.ArrayController.create({

    sortProperties: 'id'.w(),

    // random order
    content: Em.A([
        ...
    ])

});
Run Code Online (Sandbox Code Playgroud)

  • @iliacholy在工作中,我们通过定义ad hoc过滤mixin来做这种事情.我认为他们计划在ember中实现这个内置功能.克莱门斯,没问题,我今天又学到了一件事.我喜欢这种共享经历:),我不是在谈论竞争:) (3认同)

sly*_*7_7 5

灵感来自这个答案:ember.js #each order by property

我使用ArrayController的排序属性:https://github.com/emberjs/ember.js/blob/master/packages/ember-runtime/lib/mixins/sortable.js

我不使用CollectionView,而是使用简单的#each,并调用addObject而不是pushObject

模板

<script type="text/x-handlebars" data-template-name="item">
    id {{view.content.id}}
</script>

<script type="text/x-handlebars" data-template-name="application">
    <ul>
     {{#each item in App.itemController}}
        {{view App.ItemView contentBinding="item"}}
     {{/each}} 
    <li>        
</script>
Run Code Online (Sandbox Code Playgroud)

JavaScript的

App = Ember.Application.create({
  ready: function() {

    // add a new object with a random id
    // every second
    setInterval(function(){
        var id = Math.round(Math.random() * 100),
            obj = Em.Object.create({ id: id });
        // should call addObject, because pushObject does not sort the inserted item
        //App.itemController.pushObject(obj); 
        App.itemController.addObject(obj);
    }, 1000);
  }       
});

// Collection Item View
App.ItemView = Em.View.extend({
  tagName: "li",
  templateName: "item"
});

App.itemController = Em.ArrayController.create({
  sortProperties: ['id'],
  // random order
  content: Em.A([
    Em.Object.create({ id: 5 }),
    Em.Object.create({ id: 3 }),
    Em.Object.create({ id: 10 }),
    Em.Object.create({ id: 6 }),
    Em.Object.create({ id: 1 }),
    Em.Object.create({ id: 2 }),
    Em.Object.create({ id: 100 }),
  ]),
});
App.ApplicationView = Ember.View.extend({
  templateName: 'application'
});
App.ApplicationController = Ember.Controller.extend();
App.Router = Ember.Router.extend({root: Em.Route.extend()});
App.initialize();?
Run Code Online (Sandbox Code Playgroud)

jsfiddle:http://jsfiddle.net/Sly7/LJAYk/