2012-07-18 67 views
0

我不能让下面的代码工作在我的测试程序:数组排序不更新DOM

this.propertyWillChange('tableContent'); 
this.get('tableContent').sort(function (a, b) { 
    var nameA = a.artikel_name, 
    nameB = b.artikel_name; 
    if (nameA < nameB) { 
     return -1; 
    } 
    if (nameA > nameB) { 
     return 1; 
     } 
     return 0 //default return value (no sorting) 
    }); 
this.propertyDidChange('tableContent'); 

得到的数据进行排序,但DOM不会被更新。

模板看起来是这样的:

<tbody> 
    {{#each NewApp.router.gridController.tableContent}} 
     {{#view NewApp.TableRow rowBinding="this"}} 
      <td style="width: 100px">{{view.row.product_no}}</td> 
      <td align="right" style="width: 100px">{{view.row.price}}</td> 
      <td>{{view.row.artikel_name}}</td> 
     {{/view}} 
    {{/each}} 
</tbody> 

我试图重现此问题有短的jsfiddle片段。但它有效。唯一的区别是,我使用ajax调用(和一些额外的路由器设置)获取数据。

selectionChanged: function() { 
    var that = this; 
    if (this.selection) { 
    $.getJSON("api/v1/lists/" + this.selection.id + "/prices", function (content) { 
     that.set('tableContent', content); 
    }); 
} 
}.observes('selection') 

相同的代码工作,如果我复制数组并重新分配复制的数组。

+1

你能提供的jsfiddle?它可以模拟一个AJAX调用,所以这种情况下应该可以演示一个小提琴... – pangratz 2012-07-18 19:15:33

+0

[JSFiddle](http://jsfiddle.net/rogergl/PY7Hr/22/) - 但我没有公开的可用数据模拟ajax调用。 – rogergl 2012-07-18 19:35:42

回答

1

您是否尝试使用内置的SortableMixin?如果不是,这对你有好处吗?

的JavaScript:

​​

的jsfiddle:http://jsfiddle.net/Sly7/cd24n/#base

+0

非常简单! – MilkyWayJoe 2012-07-18 19:58:54

+0

@MilkyWayJoe是的,但我会等待rogergl看看它是否适用于他的应用:) – 2012-07-18 20:01:56

+0

我不知道这是否适用于他的特定实现,因为他使用属性来观察集合中的更改,但是属性被更改为相同的值'newOrder'按钮被点击,因此它触发了控制器中的'sort'方法,但它永远不会被重新设置,所以在我看来'sort'方法只会触发一次下一次它改变该属性的值时,它将与之前的值相同。我错了吗?我认为他应该使用你的实现,似乎更清洁,并做的工作 – MilkyWayJoe 2012-07-18 20:43:42