2012-07-05 29 views
2

我有一個簡單的應用程序,你可以登錄它看起來像這樣:查看結合Emberjs

{{#view App.mainV}} 
    {{#if logged}} 
    Hey! 
    {{else}} 
    <!-- Login form here when clicked: App.mainC.login()--> 
    {{/if}} 
{{/view}} 

下面是示例控制器:

App.mainC = Ember.ArrayController.create({ 
    login: function(){ 
     if(ok)//Everything went fine 
      App.mainV.logged = true; 
    } 
}); 

這裏是mainV:

App.mainV = Ember.View.extend({ 
    logged: false, 
    test: function() 
    { 
     console.log('JO'); 
    } 
}); 

我有兩個關於這個應用程序的問題:

  • 爲什麼當我改變記錄到真正的視圖不會改變?
  • 如果我打電話給App.mainV.test(),我得到一個錯誤。爲什麼?

    類型錯誤:「App.mainV.test」不是一個函數

回答

7

如果你想從模板訪問視圖的財產,你有前綴「的看法。」在你的例子中:{{#if view.logged}}

你不能這樣做App.mainV.test()因爲App.mainV是一個類,而不是一個實例。你可以做App.mainV.create().test()

你應該重新命名App.mainVApp.MainV,以適應Ember.js公約(類名應該大寫,見http://www.emberist.com/2012/04/09/naming-conventions.html

編輯

有在你的榜樣了另一個問題:控制器嘗試修改視圖中的值。在Ember方式中,您應該將視圖的屬性綁定到控制器。在控制器中的任何改變將傳播到視圖:

<script type="text/x-handlebars"> 
{{#view App.MainView}} 
    {{#if view.logged}} 
        Hey! 
    {{else}} 
        <!-- Login form here when clicked: App.mainController.login()--> 
    {{/if}} 
{{/view}} 
</script>​ 

App = Ember.Application.create(); 

App.mainController = Ember.Controller.create({ 
    logged: false, 
    login: function() { 
     this.set('logged', true); 
    } 
}); 

App.MainView = Ember.View.extend({ 
    loggedBinding: 'App.mainController.logged' 
}); 

// change in controller will be propagated to the view 
App.mainController.set('lo​gged', true);​​​​​​ 
+0

我可以訪問獲得「記錄」,但是,當它改變時,視圖不會更新。 – user50992 2012-07-05 10:00:17

+0

現在,這是一個答案,謝謝! – user50992 2012-07-05 10:29:55

+0

我最近有這樣的問題,但爲了最小化耦合,我需要一個從我的視圖到我的控制器的相對綁定,即'loggedBinding:'controller.logged''。這不起作用(儘管我不知道爲什麼)。我找到的工作是在視圖中設置一個計算屬性:'logged:Ember.computed.alias('controller.logged')' – nickiaconis 2013-08-16 16:23:34