2013-07-10 88 views
1

在我的應用程序中,我希望模塊位於不同的命名空間。我有一個App Namespace,每個模塊都有一個App.ModuleName命名空間。Emberjs:訪問控制器對不同命名空間的依賴

到目前爲止,我可以使用App/ModuleName/SomeResource語法訪問目前爲止的所有內容。現在我有一個控制器,它依賴於其中一個模塊名稱空間中的控制器。我把這樣的控制器:

App.ModuleName.FooController = Ember.Controller.extend({ 
    fooVal: 42 
}); 

App.SomeController = Ember.Controller.extend({ 
    needs: ['App/ModuleName/Foo', 'bar'] 
}); 

這似乎工作到目前爲止通過呃不抱怨所需的控制器不存在。

現在,我如何訪問我的車把模板中的控制器?對於bar控制器很簡單,只需使用controllers.bar.someProperty但我無法訪問App.ModuleName.FooController。我嘗試過:

{{controllers.App/ModuleName/Foo.fooVal}} 
{{controllers.App.ModuleName.Foo.fooVal}} 
{{controllers.Foo.fooVal}} 

等等,我可以想到的每一個組合,但它沒有工作。是否有可能(以及如何)讓這個運行?有人可以請賜我嗎?

順便說一句:即使是在控制器我用needs成功,如果我(直接或通過一個車把幫助他們登錄到控制檯,從我的代碼)進行調試的controllers屬性始終undefined。有沒有辦法檢查所需的控制器參考?

非常感謝提前。

回答

0

大家誰是興趣我是如何解決這個問題,我的嘗試和教訓:

我沒有在代碼中的一些陷和嘗試了一些東西。我使用所需的輸出

一)自定義車把助手返回控制器這樣的財產:

{{ myhelper 'App.ModuleName.FooController' 'fooVal'}}

以下的(快速和骯髒的)助手:

Ember.Handlebars.registerBoundHelper('myhelper', function(arg1, arg2, opts) { 

    if (opts && opts['data']) { 
     var ctrl = opts.data.properties[0]; 
     var prop = opts.data.properties[1]; 

     var controller = this.get('container').lookup('controller:' + ctrl.split('.').join('/')); 
     if (controller) { 
      return controller.get(prop); 
     } 
    } 
}); 

這個問題是,我無法讓數據綁定工作,所以如果我改變了我的基礎模型,視圖沒有更新。

B)重寫控制器init()方法來得到這樣的控制器實例:

init: function() { 
    this.module = this.get('container').lookup('controller:App/Module/Foo'); 
} 

,然後在模板:

{{module.fooVal}}

在第二種方式中,也數據綁定工作,但它沒有感覺是正確的,所以我做了一些googlin,並在emberjs問題列表中發現了這篇文章:

https://github.com/emberjs/ember.js/issues/683#issuecomment-5122333

正如tomdale所述,嵌套命名空間並不是真正在ember中鼓勵的東西,但多個'頂層'命名空間都可以。所以我決定爲每個模塊設置一個頂級命名空間,並使用自定義解析器來解決它們。像現在的魅力一樣工作,感覺就像做正確的方式。

任何額外的建議和意見,關於我的第二個和最終解決問題的方式的親和con的將不勝感激。

2

據我所知,Ember的容器通過解析器查找東西。它只在應用程序的命名空間中尋找東西。

DefaultResolver docs的一些示例。

'controller:post' //=> App.PostController 
'controller:posts.index' //=> App.PostsIndexController 
'controller:blog/post' //=> Blog.PostController 
'controller:basic' //=> Ember.Controller 

達到你需要什麼,你需要提供自定義Resolver創建應用程序時查找的東西在不同的命名空間。

App = Ember.Application.create({ 
    resolver: MyNewResolver 
}); 
+0

感謝您的回答。 'DefaultResolver'將'App/ModuleName/Foo'解析爲'App.ModuleName.FooController',這是正確的,所以這似乎不成問題。問題是我無法弄清楚在我的把手模板中訪問它的名字。有任何想法嗎? – Nic

+0

有趣。我的印象是命名慣例相當嚴格。 Post(模型) - > PostRoute - > PostController - > PostView - > post或post/index(隱式時)。嘗試開啓LOG_VIEW_LOOKUPS。它將打印出Ember在渲染視圖時查找的模板。 –

相關問題