2013-03-01 9 views
13

này dường như cho thấy rằng câu trả lời là có:Tài nguyên có phải là cách duy nhất để bật nhiều phân đoạn động không?

From Ember Pre1 to Pre4: Multiple dynamic segments per route? Update: What is the allowed syntax for dynamic segments?

... nhưng tôi chỉ muốn xác nhận.

Trong trường hợp của tôi, như là một bài tập học tập, tôi đang xây dựng một lịch ở Ember, với màn hình hàng tháng. Tôi cần để có thể liên kết từ một tháng nhất định cho tháng trước đó và đến tháng tiếp theo.

Vì vậy, tôi muốn để có thể

{{ linkTo calendar_month year month }} 

this.transitionTo('calendarMonth', year, month) 

Tự hỏi nếu điều này là khả thi mà không cần sử dụng tài nguyên lồng nhau. Tôi có thể lấy nó làm việc với một cái gì đó như:

App.Router.map(function() { 
    this.resource("year", { path: "calendar/:year" }, function() { 
    this.resource("calendar_month", { path: "/:month" }, function() { 
     this.route('index'); 
    }); 
    }); 
}); 

... nhưng điều này liên quan đến việc giới thiệu một đối tượng Năm mà có thể không thực sự cần phải tồn tại từ góc độ người mẫu, chỉ để tôi có thể sử dụng id của nó trong linkto

Tôi muốn thiết lập tuyến đường có hai thông số/phân đoạn động:

App.Router.map(function() { 
    this.route('calendar_month', { path: 'calendar/:year/:month'}); 
}); 

Nhưng tôi có chính xác điều này là không thể? Tôi chỉ muốn chắc chắn rằng tôi đang làm điều này một cách sạch sẽ nhất có thể.

Nói cách khác:

Tôi hiểu khái niệm này rằng "Nếu giao diện người dùng của bạn được lồng nhau, sau đó tuyến đường của bạn nên được lồng vào nhau", nhưng, nếu url của tôi là lồng nhau, điều này không nhất thiết có nghĩa là giao diện của tôi sẽ cũng được lồng nhau. Vì vậy, tôi tự hỏi: nếu url của tôi là lồng nhau, nó luôn luôn là thực hành tốt nhất để xây dựng các mô hình lồng nhau tương ứng?

Mọi hướng dẫn/làm rõ được đánh giá cao.

cảm ơn,

Trả lời

17

Vì tôi là người hỏi câu hỏi mà bạn đã tham chiếu, tôi trả lời ở đây. Tôi đã cập nhật câu hỏi của mình rằng điều này là hoàn toàn có thể.

cách tiếp cận của bạn nên làm việc:

App.Router.map(function() { 
    this.route('calendar_month', { path: 'calendar/:year/:month'}); 
}); 

Tất cả bạn phải thêm là serialize và mô hình móc hiện thực:

serialize: function(context){ 
    // i assume that you wrap year and month in an Object (maybe App.YearAndMonthObject) 
    var ret = { 
     year : context.get("year"), 
     month : context.get("month") 
    }; 
    return ret; 
}, 
model : function(params){ 
    //somehow create your object from the params 
    var model = App.YearAndMonthObject.create({ 
     year : params.year, 
     month : params.month 
    }); 
    return model; 
} 

Điều này cũng sẽ cần một sự sửa đổi về việc bạn sử dụng linkto:

{{ linkTo calendar_month year month }} 

... thay vào đó bạn sẽ chỉ sử dụng:

{{ linkTo calendar_month yearAndMonth }} 

Tôi nghĩ đây là cách giải quyết vấn đề này.

Tóm tắt: Vậy tất cả các tuyến đường là gì?

Chúng là được sử dụng để tách mối quan tâm. Và trong trường hợp của bạn có vẻ như vậy, rằng năm và tháng là một phần của cùng một mối quan tâm (= tuyến đường). Vì vậy, chúng nên được gói lại với nhau trong một đối tượng Ember mới và tuyến đường của bạn (CalendarMonthRoute) nên xử lý đối tượng mới này (có thể YearAndMonthObject hoặc CalendarMonthObject?).

+1

cảm ơn rất nhiều. rất hữu ích – doublea

+1

bạn được chào đón – mavilein

+0

các phương thức 'serialize()' và 'model()' có nằm trong 'calendar_month.js' trong ví dụ này không? – sova