2014-12-30 19 views
7

Tôi có các tuyến đường có phân đoạn động lồng nhau, ví dụ: /:locale/products/:product_id/items/:item_id v.v. Tôi muốn hoán đổi miền địa phương trong một hành động trên tuyến địa phương. Tôi không muốn chuyển sang tuyến đường cơ sở /:locale khi tôi thay đổi ngôn ngữ.ember.js - hoán đổi tài nguyên lồng nhau từ bất kỳ tuyến đường nào

locale tuyến đường hành động:

actions: { 
    localeChanged: function(locale) { 
    var route = this.controllerFor('application').get('currentRouteName'); 
    this.transitionTo(route, locale); 
    } 
} 

này chỉ hoạt động khi tôi không lồng nhau sâu sắc. Tôi muốn tránh thực hiện hành động localeChanged trong mọi tuyến đường để cung cấp các mô hình chính xác cần thiết cho một tuyến đường nhất định.

Cập nhật 1 - giải pháp bẩn:

actions: { 
    localeChanged: function(locale) { 
    var routes = this.router.router.currentHandlerInfos; 
    var models = []; 
    for (var i = 0; i < routes.length; i++) { 
     var params = routes[i].params; 
     for (var param in params) { 
     if (params.hasOwnProperty(param)) { 
      models.push(param === 'locale' ? locale : params[param]); 
     } 
     } 
    } 

    var args = models.slice(); 
    var currentRouteName = this.controllerFor('application').get('currentRouteName'); 
    args.unshift(currentRouteName); 
    this.transitionTo.apply(this, args); 
    } 
} 

tôi nói bẩn vì iterating trên this.router.router.currentHandlerInfos dường như dễ bị lỗi. Có cách nào tốt hơn?

+2

Bạn có thể đặt 'locale' làm tham số truy vấn trái ngược với một phần của tài nguyên/tuyến đường không? – Kalman

+0

Điều đó chắc chắn sẽ làm cho nó dễ dàng hơn. Tôi không biết liệu tôi đã sẵn sàng thừa nhận chưa. –

+0

Điều này có thể là bẩn quá, nhưng làm thế nào về regex sửa đổi miền địa phương trên toàn bộ 'location.pathname' nếu nó luôn luôn là phần đầu tiên của đường dẫn? Ember sẽ xử lý độ phân giải đường đầy đủ? – Laurence

Trả lời

0

Bạn có thể tạo baseRoute để thêm hành động này. Sau đó tất cả các tuyến đường của bạn có thể kế thừa từ tuyến đường cơ sở này. Bạn chỉ phải viết mã một lần, và nó được chia sẻ trên tất cả các tuyến đường. Ví dụ.

App.BaseRoute = Ember.Route.extend({ 
    actions: { 
    localeChanged: function(locale) { 
    var routes = this.router.router.currentHandlerInfos; 
    var models = []; 
    for (var i = 0; i < routes.length; i++) { 
     var params = routes[i].params; 
     for (var param in params) { 
     if (params.hasOwnProperty(param)) { 
      models.push(param === 'locale' ? locale : params[param]); 
     } 
     } 
    } 
    var args = models.slice(); 
    var currentRouteName = this.controllerFor('application').get('currentRouteName'); 
    args.unshift(currentRouteName); 
    this.transitionTo.apply(this, args); 
    } 
    }}); 


App.SomeRoute = BaseRoute.extend(); 
+0

Mã đó đã có trên tuyến ứng dụng. –

Các vấn đề liên quan