2012-09-22 11 views
8

Tôi muốn có thể sắp xếp một số ArrayController có nội dung phát sinh từ truy vấn dữ liệu ember. Thật không may, hỗn hợp sortProperty dường như không hoạt động trong trường hợp này.Sắp xếp một ArrayController được hỗ trợ bởi Ember-Data thông qua sortProperty mixin

Tôi muốn để có thể làm như sau:

App = Ember.Application.create(); 
App.store = DS.Store.create({ revision: 4}); 

App.Item = DS.Model.extend({ 
    id: DS.attr('string'), 
    name: DS.attr('string') 
}); 

App.store.createRecord(App.Item, {id: '4', name: 'banana' }); 
App.store.createRecord(App.Item, {id: '2', name: 'apple'}); 
App.store.createRecord(App.Item, {id: '6', name: 'spaghetti'}); 

App.ItemsController = Ember.ArrayController.create({ 
    content: App.store.findAll(App.Item), 
    sortProperties: ['name'] 
}); 

Với phiên bản mới nhất của Ember và Ember dữ liệu, điều này sẽ cho kết quả:

[ id: 4, name: banana ] 

[ id: 2, name: apple ] 

[ id: 6, name: spaghetti ] 

Vấn đề ở đây là rằng App.store.findAll() trả lại một RecordArray có nội dung không chỉ đơn giản là một mảng của App.Item trường hợp (trong trường hợp này, nội dung là [2, 3, 4])

Để thực sự có được bàn tay của tôi trên các trường hợp tôi cần phải sử dụng một cái gì đó như objectAt(). Nhưng ngay cả khi tôi trích xuất các trường hợp App.Item từ RecordArray và đổ chúng vào một mảng thông thường, mọi thứ không hoạt động như mong đợi.

Tôi có thiếu cách rõ ràng để thực hiện việc này hay đây chỉ là trạng thái hiện tại của khung công tác? Tôi không muốn sao chép tất cả các mô hình của tôi như là các đối tượng đơn giản chỉ để sắp xếp chúng.

EDIT:

tôi xung quanh vấn đề này bằng cách làm riêng của tôi ArrayController. Tuy nhiên, sẽ tốt hơn nếu mọi thứ hoạt động như trên.

EDIT # 2:

Original tay lái mẫu: (. Ngoài ra, tôi đã sử dụng một tài sản thay vì sortProperties trong mã của tôi trên sortProperty, nhưng đó chỉ là một lỗi đánh máy)

<script type="text/x-handlebars"> 
    {{#each App.ItemsController.content }} 
     <p>[ id: {{id}}, name: {{name}} ]</p> 
    {{/each}} 
</script> 

Và vâng, nếu một thay vì sử dụng

<script type="text/x-handlebars"> 
    {{#each App.ItemsController.arrangedContent }} 
     <p>[ id: {{id}}, name: {{name}} ]</p> 
    {{/each}} 
</script> 

Sau đó chúng ta có được chính xác những gì chúng ta muốn:

[ id: 2, name: apple ] 

[ id: 4, name: banana ] 

[ id: 6, name: spaghetti ] 
+5

Tôi xin lỗi, bạn đã không thực hiện một đặc biệt Tôi nghĩ rằng có một vấn đề nhỏ mà đôi khi bạn phải liên kết với giá trị 'arrangContent' của' ArrayController' để có được các đối tượng được sắp xếp chính xác. –

Trả lời

6

Kể từ Ember 1.1.2 và dữ liệu ember 1.0.0-beta.3, và có thể trước đó, chỉ cần thiết lập sortProperties trên Controller là đủ. sortAscending có thể được đặt thành true hoặc false tùy thuộc vào hướng bạn muốn sắp xếp.

App.ArrayController = Ember.ArrayController.extend({ 
    sortProperties: ['name'], 
    sortAscending: true 
}) 

Tuy nhiên, lưu ý rằng

sortProperties: ['id'] 

dường như loại lexically chứ không phải số lượng. Tôi nhận được xung quanh việc phân loại từ vựng bằng dấu thời gian created_at, nhưng có thể có một cách khác xung quanh nó.

+0

'sortProperties' có thể được thay đổi động sau khi tải không? và làm thế nào để bạn chọn tăng dần hoặc giảm dần? –

+0

Đã thêm vào tham chiếu để sắp xếp Tăng dần. Ngoài ra, khi thay đổi sắp xếp động, có vẻ như điều đó là có thể - http://stackoverflow.com/questions/12476682/how-to-modify-the-sortproperties-value-dynamically-inside-an-ember- js-arraycontr –

11

tôi đã cùng một vấn đề. Đã cho tôi một thời gian, nhưng cuối cùng giải pháp chung này giải quyết nó:

App.ArrayController = Ember.ArrayController.extend({ 
    sortProperties: ['id'], 
    sortAscending: true, 

    sortedContent: (function() { 
    var content; 
    content = this.get("content") || []; 
    return Ember.ArrayProxy.createWithMixins(Ember.SortableMixin, { 
     content: content.toArray(), 
     sortProperties: this.get('sortProperties'), 
     sortAscending: this.get('sortAscending') 
    }); 
    }).property("[email protected]", 'sortProperties', 'sortAscending'), 

    doSort: function(sortBy) { 
    var previousSortBy; 
    previousSortBy = this.get('sortProperties.0'); 
    if (sortBy === previousSortBy) { 
     return this.set('sortAscending', !this.get('sortAscending')); 
    } else { 
     set('sortAscending', true); 
     return this.set('sortProperties', [sortBy]); 
    } 
    } 
}); 

Bây giờ hầu hết ArrayControllers tôi mở rộng App.ArrayController thay vì Ember.ArrayController, đặc biệt là những người mà có Ember/Dữ liệu RecordArray s như nội dung.

Bây giờ, trong các mẫu handlebar của bạn, làm điều này:

{{#each item in sortedContent}} 
    ...   
{{/each}} 

thay vì

{{#each item in content}} 
    ...   
{{/each}} 
+0

Tôi chấp nhận điều này vì nó giải quyết được vấn đề của tôi, nhưng như Bradley Priest đã nêu ở trên, ràng buộc với arrangContent là đủ. – ahmacleod

+0

Chỉ cần một lưu ý, tôi thấy rằng bằng cách sử dụng một ArrayController thay vì một ArrayProxy w/mixin làm việc cho tôi. Tôi không chắc những tác dụng phụ nào khác của nó, nhưng nó hoạt động hoàn hảo. Tôi đã đọc rằng ArrayController thực sự là ArrayProxy với mixins, nhưng nó dường như không hành xử theo cách đó. – mbseid

3

Tính đến Ember phiên bản 1.0.0-rc.4 Ember.ArrayProxy.create(Ember.SortableMixin .... dường như không có tác dụng nữa.Sử dụng Ember.ArrayProxy.createWithMixins(Ember.SortableMixin .... hoặc sử dụng chức năng sắp xếp được tích hợp trong Ember.ArrayController.

+0

Cảm ơn, đã chỉnh sửa câu trả lời với bản sửa lỗi của bạn :) –

4

Tôi gặp sự cố tương tự và sắp xếp nó ra qua docs for the array class
trong tuyến đường của tôi, tôi đã sử dụng phương thức sortBy(). như vậy trong trường hợp của bạn nó có thể là một cái gì đó giống như

App.store.findAll().sortBy('name'); 

Tôi biết đây là một câu hỏi cũ nhưng trả lời nó trong trường hợp ai đó, giống như bản thân mình loạng choạng trên bởi

+1

'this.store.findAll ('todo-list'). sortBy ('name')' đang trả về một mảng trống trên đầu của tôi, không chắc chắn tại sao. – Link14

+0

không xóa 'sortBy()' tạo sự khác biệt? bạn đang cố sắp xếp loại tài sản gì? – Craicerjack

+1

Đây là mã của tôi 'var todoLists = this.store.findAll ('todo-list'). SortBy ('name');'. Nếu tôi loại bỏ 'sortBy()', kết quả là chính xác. Mô hình tôi nhận được là https://github.com/LouWii/ember-todo-list-app/blob/master/app/models/todo-list.js (toàn bộ dự án là trên Github repo thực sự). – Link14