2012-07-17 75 views
1

此處的總Noob問題。我爲簡單而道歉,並且我在這裏瀏覽了數百個Ember標記的帖子,尋找答案。但似乎是太原始的任何人打擾之前詢問...無法獲取Ember.js從控制器中的對象呈現屬性

我從頭開始與Ember。我做了Andy Matthews的EmberTweets教程,效果很好。我試圖用它作爲我的第一個Ember應用程序的基礎,這非常簡單;但我堅持了最基本的步驟。我似乎有一個功能正常的控制器,並且似乎成功地爲它添加了新的對象。但我不能爲了我的生活讓我的視圖呈現這些對象的屬性。基本視圖呈現出來,但不是來自控制器的數據,我只是試圖用簡單的#each來訪問。我在任何瀏覽器控制檯中獲得沒有錯誤

小提琴是here

我試過在我的例子中以三種不同的方式向控制器添加對象,看看是否有幫助。我可以通過檢查內容數組或者類似於FilterMenus.MenusController.content.objectAt(2).get('menu_name'),從控制檯成功訪問對象的屬性。顯然,這些數據是正確的。

但是當我嘗試渲染出任何屬性時,仍然沒有出現在我的模板中,如:{{menu_name}}。請問我做錯了什麼?

回答

6

正如其他答案中所述,您必須將您的應用程序聲明爲全局變量(通過省略var)。

除此之外,您不在FilterMenus.menusControllerinit方法中調用this._super()。這是正確設置Ember.ArrayController所需的,因此修改content將起作用。

除了這兩個問題,你的代碼看起來很好。這是一個工作小提琴:http://jsfiddle.net/pangratz666/HPkHt/

+1

謝謝,@ pangratz!非常感謝您在這裏對Ember的廣泛貢獻。 – XML 2012-07-17 15:49:08

+0

由於應用程序聲明發生在全局範圍內,因此即使使用'var'也不是全局變量嗎? (我明白,這兩種宣告方式之間存在技術上的區別,除了範圍之外,這兩種宣言一般都沒有副作用,這是次要的區別 - 而不是全球性或缺乏 - 在這裏有所不同?) – XML 2012-07-25 16:56:09

2

Ember的代碼很大的問題是您的Application被定義爲var,所以無法從模板訪問它。刪除var關鍵字幫助。

出於某種原因,不過,這是不是很夠,我不得不添加

this.set('content', []); 

爲您的初始化函數的第一線,得到它的工作。我從來沒有這樣做過,所以我不知道這是否是jsFiddle做的事情。如果任何人有一些亮光可以解決這個問題,我很樂意聽到它。

+0

是的,我也嘗試刪除var關鍵字,但沒有得到任何與此。但是,當我們談論這個問題時:我注意到Ember應用程序定義似乎永遠不會被定義爲變量。爲什麼不?他們還有什麼? – XML 2012-07-17 02:30:28

+0

@XMLilley應用程序被聲明爲全局對象,因此可以在模板內部訪問它們,並且可以解析像'nameBinding:'App.name'這樣的全局綁定。 – pangratz 2012-07-17 04:37:37

+1

@Drew'this.set('content',[]);'是需要的,因爲this._super()不在'FilterMenus.menusController'的'init'方法內調用。但是,這是需要設置觀察員的內容,... – pangratz 2012-07-17 04:39:20

1

嘗試以下操作:

  1. 刪除FilterMenus宣言 「VAR」:

    FilterMenus = Em.Application.create(); 
    
  2. 變化menusController.addMenu實施爲:

    addMenu: function(menu) { 
        this.content.push(menu); 
    }, 
    

這引起了我的兩個菜單名稱後「選擇國家」,並且說明段展現出來:

countries 
countries2 

灰燼似乎不知道什麼是this.pushObject(menu);。儘管如此,直接推入控制器的內容數組始終有效。

+2

不應該直接訪問'Ember.Object'上的屬性,所以爲了保證正確的工作綁定'this.content'應該是'this.get('content')'。 – pangratz 2012-07-17 04:35:36