2012-09-11 75 views
0

我試圖將我的應用程序移動到使用「插座」的新Emberjs路由器組件。Emberjs路由器:查看屬性未定義在關聯的控制器

見參考文獻:http://emberjs.com/guides/outlets/這: http://codebrief.com/2012/07/anatomy-of-an-ember-dot-js-app-part-i-redux-routing-and-outlets/

我如何理解這個工作: 當使用字符串下面的事情發生在連接插座

  1. 灰燼查找視圖定義上該應用程序並實例化它
  2. Ember尋找應用程序上的控制器定義並創建它的一個實例
  3. 掛鉤兩者相互之間如下所示:設置視圖控制器屬性並設置控制器視圖屬性

---直到最後一步工作。我似乎無法獲得在控制器上設置視圖屬性。

JSBin這裏:http://jsbin.com/ekekir/40/edit

相關代碼:

App.Router

App.Router = Ember.Router.extend({ 
    root: Ember.Route.extend({ 
    state1: Ember.Route.extend({ 
     route: '/state1', 

     connectOutlets: function (router) { 
     router.get('applicationController').connectOutlet('state1') 
     } 
    }) 
    }) 
}); 

控制器和視圖

App.State1View = Ember.View.extend ({ 
    templateName: 'state1', 
    submit: function() { 
    this.get('controller').doLogView(); 
    return false; 
    } 
}); 

App.State1Controller = Ember.Controller.extend({ 
    doLogView: function() { 
    console.log('Getting controller view:'); 
    console.log(this.get('view')); 
    } 
}); 

在t他結束它返回一個大胖的空。

我是不是做錯了什麼或者這只是它的方式應該是什麼?

BTW:This is using ember-1.0.pre。

回答

3

邁克阿斯基是正確的,控制器不應該知道該視圖。

不過,目前的實現實際上確實設置視圖上控制器,但不是你所期望的控制器。在上例中,applicationControllerview屬性將被設置爲State1View的實例。

從Ember的源位置相關代碼:

https://github.com/emberjs/ember.js/blob/master/packages/ember-views/lib/system/controller.js#L140

+0

感謝您的澄清。 Mike Aski說的是有道理的,你不應該嘗試這樣做,但是如果你需要*你可以這樣做:'App.get('router.applicationController.view')' – oportocala

2

這是一種正常行爲,因爲控制器不必知道呈現其內容的視圖。你會有一個依賴週期(和一個破碎的設計......)。

的依賴遵循鏈:N - >Ç - > MS

此外,所述控制器被注射一次,並且該視圖創建的每個被顯示的時間。

+0

所以這種說法「將控制器設置爲新實例化視圖的視圖屬性。」在[這裏](http://codebrief.com/2012/07/anatomy-of-an-ember-dot-js-app-part-i-redux-routing-and-outlets/)顯然是錯誤的?還是它指的是ApplicationController? – oportocala

+2

@oportocala,你可以在這裏看到:https://github.com/emberjs/ember.js/blob/master/packages/ember-views/lib/system/controller.js#L139,'connectOutlets'將控制器設置爲視圖的上下文,但不會將視圖設置爲控制器的屬性。 –

相關問題