2013-03-01 5 views
13

Wydaje się to sugerować, że odpowiedź brzmi tak:Czy zagnieżdżanie zasobów jest jedynym sposobem na włączenie wielu segmentów dynamicznych?

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

... ale ja po prostu chcę, aby potwierdzić.

W moim przypadku, jako ćwiczenie do nauki, buduję kalendarz w Ember, z miesięcznymi wyświetlaczami. Muszę mieć możliwość połączenia z danego miesiąca do poprzedniego miesiąca i do następnego miesiąca.

Więc chciałbym, aby móc

{{ linkTo calendar_month year month }} 

i

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

Zastanawiasz się, czy jest to możliwe bez użycia zagnieżdżonych zasobów. mogę dostać pracy z czymś takim:

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

... ale wiąże się to z wprowadzeniem obiektu roku, który może naprawdę nie musi istnieć z perspektywy modelowania, tak więc mogę użyć jego identyfikator w linkTo

wolałbym, aby skonfigurować trasę z dwoma parametrami/dynamicznych segmentów:

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

Ale mam rację, że to nie jest możliwe? Chcę tylko upewnić się, że robię to w najczystszy, najsurowszy sposób.

Innymi słowy:

rozumiem to pojęcie, że „Jeśli interfejs użytkownika jest zagnieżdżona, to wasze trasy powinny być zagnieżdżone”, ale jeśli mój adres URL jest zagnieżdżona, to niekoniecznie oznacza, że ​​mój interfejs być również zagnieżdżonym. Zastanawiam się: jeśli mój adres URL jest zagnieżdżony, czy zawsze najlepiej jest budować odpowiednie modele zagnieżdżone?

Wszelkie wskazówki/wyjaśnienia bardzo doceniane.

Dzięki,

Odpowiedz

17

jak ja Pytający z pytaniem jesteś odwołanie, odpowiadam tutaj. Już zaktualizowałem moje pytanie, że jest to całkowicie możliwe.

Twoje podejście powinno działać:

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

Wszystko trzeba dodać to serializacji i model hak implementacje:

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; 
} 

to również potrzeba modyfikacji od wykorzystania linkTo:

{{ linkTo calendar_month year month }} 

... zamiast tego wystarczy użyć:

{{ linkTo calendar_month yearAndMonth }} 

Wydaje mi się, że to sposób na uporanie się z tym.

Podsumowanie: Więc jakie są wszystkie trasy?

stosowane do oddzielenia obawy. A w twoim przypadku wydaje się, że rok i miesiąc są częścią tego samego problemu (= trasy). Dlatego powinny one być owinięte razem w nowy Obiekt Embera, a twoja trasa (CalendarMonthRoute) powinna poradzić sobie z tym nowym obiektem (może YearAndMonthObject lub CalendarMonthObject?).

+1

dziękuję bardzo. bardzo pomocna – doublea

+1

serdecznie zapraszamy – mavilein

+0

czy metody 'serialize()' i 'model()' żyłyby wewnątrz 'calendar_month.js' w tym przykładzie? – sova

Powiązane problemy