2015-05-22 14 views
10

Đối với mục đích báo cáo, tôi muốn kết hợp một số siêu dữ liệu với một con đường Ember, và muốn làm điều đó như sau:Thêm và lấy dữ liệu từ các tuyến đường Ember

this.route('list', { path: '/list', description: 'Master List' }); 

sau đó truy cập vào tài sản description này từ những nơi như tự định tuyến hoặc từ các nơi khác, chẳng hạn như móc didTransition trên bộ định tuyến ứng dụng. Tôi đã xem xét nguồn cho Router và Route và không thể nói tôi thực sự hiểu nó, chắc chắn cũng không đủ để hiểu cách lấy các thuộc tính tùy chỉnh được chỉ định theo cách này. Tôi thấy có một đối tượng được gọi là DSL, rõ ràng là this của số this.route được chỉ định trong phương pháp map trên Router, nhưng không thể xem cách nhận từ đây đến đó. Từ trong một lớp con của Ember.Route, tôi thấy các thuộc tính được gọi là this.routerthis.router.router, nhưng không rõ ràng về những điểm này.

Hoặc, sau đây cũng sẽ làm việc nếu điều đó cho phép tôi làm những gì tôi muốn:

this.route('list', { path: '/list' }, function() { 
    this.description = "Master List"; 
}); 

Tôi có thể kết hợp các thuộc tính tùy chỉnh với một lộ trình quy định tại Router#map, và nếu như vậy như thế nào?

+1

Tôi có thể thấy bạn đã cố gắng đi qua mã nguồn để thử làm việc nó - vì vậy tôi mang nó cho bạn thoải mái mở rộng/sửa đổi các triển khai mặc định của Ember.Router/Ember.Theo dõi và triển khai các phiên bản của riêng bạn EmberDSL - sẽ triển khai/thay đổi rất nhiều API riêng tư - để đạt được mục tiêu cuối cùng mà bạn đang theo đuổi. Bạn sẽ phải giữ cho việc triển khai của bạn được cập nhật với những thay đổi trong Ember - luôn đảm bảo rằng bạn đã làm việc khi bạn nâng cấp .. Đây có phải là điều bạn sẵn sàng làm để có được kết quả mong muốn không? – jmurphyau

Trả lời

0

tôi đã kết thúc giải quyết này dọc theo dòng sau đây, viết "con đường" của riêng tôi chức năng ghi lại dữ liệu tôi cần, sau đó vượt qua nó cùng với DSL:

var myRouteData = {}; 

function route(dsl, name, options, fn) { 
    if (typeof options === 'function') fn = options, options = {}; 
    var routeName = dsl.parent ? dsl.parent + '.' + name : name; 
    myRouteData[routeName] = { options.myRouteOption }; 

    dsl.route(name, options.fn); 
} 

Cách sử dụng:

this.resource('foo', function() { 
    route(this, 'bar', {myRouteOption: true}); 
}); 
2

Có không xuất hiện để có một cách thanh lịch để thiết lập siêu dữ liệu về một lộ trình khi nó được định nghĩa trong các bộ định tuyến, nhưng có lẽ thử giải pháp này xấu xí trong bộ điều khiển ứng dụng của bạn:

currentPathChange: function() { 
    switch(this.get('currentPath')){ 
    case 'test.index': 
     console.log('test.index is the foo!'); 
     break; 
    case 'test.new': 
     console.log('test.new is the bar!'); 
     break; 
    } 
}.observes('currentPath') 

JSBin DEMO

+0

Phải, cảm ơn, đó là những gì tôi đang cố gắng tránh. –

0

Nếu không mở rộng Bộ định tuyến của Ember, một tùy chọn là có một đối tượng riêng biệt duy trì siêu dữ liệu tuyến đường. Ví dụ đơn giản:

this.route('list', { path: '/list' }); 
routeMetaData['list'] = 'Master List'; 

Để truy cập vào siêu dữ liệu trong móc didTransition:

didTransition: function() { 
    var metadata = routeMetaData[this.routeName]; 
} 
Các vấn đề liên quan