2013-08-31 86 views
1

我最近不得不將所有路線轉換爲深度嵌套版本。例如:pages.page變成了books.book.pages.page。對於我正在做的一些鏈接來說,這是必要的。問題是我有一個控制器聲明它需要另一個控制器。具體來說,它需要book控制器。但是現在book控制器是books.book控制器。這就提出一個問題,因爲這個代碼將不再有效:控制器#需要 - 路由有點嗎?

this.get('controllers.books.book'); 

現在認爲book只是在books控制器的性能,在現實中,它都是一個性質。我該如何解決這個問題?到目前爲止,我已經試過這些方法,沒有一個工作:

this.get('controllers').get('books.book'); 
this.get('controllers.`books.book`'); 
this.get("controllers.'books.book'"); 

編輯:我還應該指出的是叫this.get('controllers').needs給我的數組:['application', 'books.book']

回答

1

this.get('controllers.booksBook')會工作。

因爲Ember在各個地方使用了一些不同的命名約定,所以無論何時嚮應用程序容器註冊一個對象時,它的名稱都會被標準化。這確保了不同的查找格式總是以相同的方式解決。因此,您可以使用不同的查找格式明確地在屬性路徑中引用控制器。

規範化將虛線路徑和下劃線字符串轉換爲camelized。正斜線被保留。您可以參閱packages/ember-application/tests/system/dependency_injection/normalization_test.js中的測試以獲取更多詳細信息。

+0

這實際上似乎沒有工作。使用'controllerFor'可以返回正確的控制器,但是使用該代碼只會返回undefined。另外,我在第一篇文章中加入了一些信息來澄清一些事情。 – GJK

+0

劃痕,這實際上確實工作。我只需要聲明控制器需要'bookBook'而不是'books.book'。謝謝! – GJK

0

您是否嘗試過使用this.get('controllers.pages');來訪問PagesController?我相信你不必指定整個路徑。

這裏是爲我工作很短的例子:

App.Router.map(function() { 
    this.resource('books', function() { 
    this.resource('book', function() { 
     this.resource('pages', function() { 
     this.route('page', function() { 

     }); 
     }); 
    }); 
    }); 
}); 

App.PagesController = Ember.ObjectController.extend({ 
}); 

App.BookController = Ember.ObjectController.extend({ 
    needs: "pages", 
    pages: function() { 
    return 'My PagesController, ' + this.get('controllers.pages') 
    }.property() 
}); 
+0

就你而言,'pages'是路由的真實名稱。在你的代碼中,不是'book',而是使用'books.book',然後使用'books.book.pages'等。(如下所示:http://emberjs.com/guides/routing/defining-your-路線/)你會發現你的代碼不起作用。 – GJK

+0

也許我誤解了你告訴我的內容,但是如果你有深度嵌套的名爲BooksBookPagesPageController的控制器。這似乎令人費解。所以這可能是一個更清潔的方法。 – kroofy

+0

相信我,這是一個更清潔的方法。但是我在鏈接時遇到了問題。具體來說,我有一些角落案例,我無法鏈接到更深的路線,因爲我無法提供所有需要的模型。這種方式更加冗長,但更明確,更容易一些。 – GJK