2014-06-11 62 views
1

我開始使用Ember.js,並且其中一個頁面有三級路由。這是路由器地圖的樣子:Ember.js中存在奇怪行爲的多個嵌套路由

App.Router.map(function(){ 
    this.resource('tests'); 
    this.resource('create', function() { 
     this.resource('create.questions', {path: ':test_id' }, function() { 
      this.resource('create.questions.question', {path: ':question_id'}); 
     }); 
    }); 
}); 

在我CreateRoute,我使用下面的代碼過渡到建立/問題的途徑:

this.get('controller').transitionToRoute('create/questions', test); 

,工作正常,但在我CreateQuestionsRoute,這代碼不起作用:收到

this.get('controller').transitionToRoute('create/questions/question', question); 

錯誤:

Uncaught Error: Assertion Failed: Error: Assertion Failed: The route create/questions/question was not found 

使用Chrome的灰燼檢查插件,可以看我的路線被列出象這樣:

CreateRoute 
CreateQuestionsRoute 
CreateQuestions.QuestionRoute 

這似乎是任意的行爲。關於如何處理多個嵌套路由沒有太多指導。有些引用告訴我,我的路線圖實際上應該是這樣的:

App.Router.map(function(){ 
     this.resource('tests'); 
     this.resource('create', function() { 
      this.resource('questions', {path: ':test_id' }, function() { 
       this.resource('question', {path: ':question_id'}); 
      }); 
     }); 
    }); 

由此路線名稱將自動嵌套(無需點標記),但這並沒有工作。任何有着灰燼智慧的人都能爲我閃耀一些光芒嗎?

回答

1

轉到與此:

App.Router.map(function(){ 
    this.resource('tests'); 
    this.resource('create', function() { 
     this.resource('questions', {path: ':test_id' }, function() { 
      this.resource('question', {path: ':question_id'}); 
     }); 
    }); 
}); 

的唯一原因增加命名空間的資源,如果資源不是唯一的。從任何途徑,這意味着你可以使用

this.transitionTo('questions', model); 

this.transitionTo('question', modelForQuestions, modelForQuestion); 

例子:http://emberjs.jsbin.com/OxIDiVU/636/edit

如果你想讓你的命名空間,我會去與駝峯而不是點符號,因爲一般的點指在當前屬性範圍。

例如:http://emberjs.jsbin.com/OxIDiVU/637/edit

+0

謝謝您的回答!不過,我想問問是否有辦法保留命名空間?如果我刪除點符號,我將不得不擁有一個QuestionController,稍後我可能需要在不同的父路徑下使用它。希望這是有道理的? –

+0

我最終需要在單獨的父項下提供問題和疑問資源。我知道'創造'聽起來更像是一條路線,但Ember不允許在路線下築巢 –

+1

是的,你可以完全做到這一點,我會避免點和去駱駝。 http://emberjs.jsbin.com/OxIDiVU/637/edit – Kingpin2k