2013-04-10 123 views
3

我有一個鏈接,看起來像這樣灰燼路由器:如何使用transitionTo

index.html#/calendar/year/month 

這是我建立了我的路線:

App.Router.map(function() { 
    this.resource('calendar', {path: 'calendar/:currentYear/:currentMonth'}); 
}); 

App.CalendarRoute = Ember.Route.extend({ 
    model: function (params) { 
    var obj = { 
     weeks: calendar.getDaysInMonth(params.currentMonth, params.currentYear), 
     currentMonth: params.currentMonth, 
     currentYear: params.currentYear 
    }; 
    return obj; 
    }, 
    setUpController: function(controller, model) { 
     controller.set('content', model); 
    } 
}); 

我可以這樣得到它:

var currentMonth = this.get('content.currentMonth'); 
var nextMonth = parseInt(currentMonth)+1; 
var route = '#/calendar/' 
var year = this.get('content.currentYear'); 
window.location.href= route + year + '/' + nextMonth; 

但我想用路由器代替。

我想:

var router = this.get('target'); 
router.transitionTo('#calendar/'+year + '/' + nextMonth); 

但我得到這個錯誤:

Uncaught Error: assertion failed: The route #calendar/2013/5 was not found

我也試過:

var router = this.get('target'); 
router.transitionTo('calendar/'+year + '/' + nextMonth); 

但是,這也給了我一個錯誤:

Uncaught Error: assertion failed: The route calendar/2013/5 was not found

編輯:顯示我上面的路由

+1

嗯,在''router.transitionTo('#calendar /'+ year +'/'+ nextMonth);'你在#之後缺少一個「/」。我不知道還有什麼可能是錯誤的,但我通常使用'this.transitionToRoute('example.name');'或'App.Router.router.transitionTo('example.name');''。 – 2013-04-10 12:43:48

+0

聽起來不錯,所以我只是試過:router.transitionTo('#/ calendar /'+ year +'/'+ nextMonth);但後來我得到未捕獲的錯誤:斷言失敗:沒有找到路線#/ calendar/2013/5 – redconservatory 2013-04-10 12:52:15

+1

@redconservatory我相信這個問題與您的路線定義有關。這可能應該是一個嵌套路線,其中一個分段爲一年,另一個分段爲一個月份。此外,他目前正在做的方式似乎在該路線中缺少'model'方法中的'params'參數。 – MilkyWayJoe 2013-04-10 13:36:20

回答

4

從我在評論中所說的內容來看,這實際上可以在不需要嵌套路線的情況下使用Route#serialize來完成。

我已經類似於你所描述的情景做出this fiddledemo here):

在應用程序中,我存儲月份和年份參數

window.App = Ember.Application.create({ 
    title: 'Cool App', 
    calendar: { 
     month: new Date().getMonth()+1, 
     year: new Date().getFullYear() 
    } 
}); 

定義路由

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

在日曆路線中,我添加了serialize方法,以翻譯obj中的屬性到應用程序,然後我連接到第三方庫在setupController獲得days屬性並設置其內容。

App.CalendarRoute = Em.Route.extend({ 
    activate: function() { 
     $(document).attr('title','Events') 
    }, 
    serialize: function(obj) { 
     return { 
      year: obj.year, month: obj.month 
     } 
    }, 
    setupController: function(controller, model) { 
     var obj = { 
      days: calendar.getDaysInMonth(model.month, model.year), 
      year: model.year, 
      month: model.month 
     }; 
     controller.set('content', obj); 
    } 
}); 

在車把,使用{{linkTo}}幫手,我路過我App類中定義爲參數的calendar屬性:

{{#linkTo calendar App.calendar tagName="li"}} 
    <a {{bindAttr href="view.href"}}> 
     Calendar 
    </a> 
{{/linkTo}} 

這將產生一個鏈接到~/#/calendar/2013/4

+0

謝謝!這實際上是比實際文檔更完整的解釋。真的有幫助。 – redconservatory 2013-04-15 13:54:53

+0

我感到你的痛苦。文檔有一些差距,但我相信它會很快好起來的。如果你想幫助,你應該訪問[網站回購](https://github.com/emberjs/website/issues)。有很多事情要做:) – MilkyWayJoe 2013-04-15 14:04:07

0

路由器不僅僅是一個url管理器。它管理整個應用程序的狀態。爲了充分幫助你,最好能看到更多的代碼。你創建了路線嗎?你只是想去一個'網址',而不是由呃應用程序處理?

this.transistionTo(routeName)預計會收到一條我知道的命名路線。它會爲該路線生成正確的網址。如果你還沒有設置任何路線,那麼我認爲你不能使用它。

+0

在上面添加了我的路由代碼 - 謝謝。 – redconservatory 2013-04-10 12:55:55

+0

so'router.transitionTo('calendar',2013,5)'不起作用? – 2013-04-10 13:12:41

+0

這給了我「未捕獲更多的對象通過比動態段」 – redconservatory 2013-04-15 17:04:11