You have to manually sort arrays, including any array controller's content, in Ember. You could always replace content with your sorted array instead of keeping both arrays.
Update
Here is an example of what I think you're looking for: http://jsfiddle.net/ud3323/yjs8D/
Update #2
Updated this example to use the new view context changes. https://gist.github.com/2494968
Handlebars
<script type="text/x-handlebars" >
Will Display and Sort by Age (after 2 sec)<br/><br/>
{{#each App.userController}}
{{#view App.RecordView}}
{{name}} - {{age}}
{{/view}}
{{/each}}
</script>
JavaScript
App = Ember.Application.create({
ready: function() {
Ember.run.later(this, function() {
Ember.run.later(this, function() {
App.get('userController').set('content', [
Ember.Object.create({ name:"Jeff", age:24 }),
Ember.Object.create({ name:"Sue", age:32 }),
Ember.Object.create({ name:"Jim", age:12 })
]);
}, 2000);
Ember.run.later(this, function() {
// Make the controller's content sort again in reverse this time
App.userController.notifyPropertyChange('content');
}, 4000);
}
});
App.userController = Ember.ArrayController.create({
content: [],
contentDidChange: Ember.observer(function(userCtr, prop) {
if(!Ember.empty(this.get('content'))) {
console.log('about to begin sort');
this.sortContent();
}
this._super();
}, 'content'),
sort:"desc",
sortContent:function() {
var content = this.get("content"), sortedContent;
if (this.get("sort") == "desc") {
this.set("sort", "asc");
sortedContent = content.sort( function(a,b){
return a.get("age") - b.get("age");
});
} else {
this.set("sort","desc");
sortedContent = content.sort( function(a,b){
return b.get("age") - a.get("age");
});
}
this.set("content",sortedContent);
}
});
App.RecordView = Ember.View.extend({});