2013-03-18 58 views
1

在Ember.js中,修改控制器屬性值的最佳做法是什麼?更改控制器屬性值

考慮下面的玩具應用程序:

JS:

window.App = Ember.Application.create(); 

App.ApplicationController = Ember.Controller.extend({ 
    firstNameBinding: "App.myModel.name", 
    lastName: "Smith", 
    signedIn: true 
}); 

App.myModel = Ember.Object.create({ 
    name: 'John' 
}); 

HB:

<script type="text/x-handlebars" data-template-name="application"> 
    {{#if signedIn}} 
     Welcome back, <b>{{firstName}} {{lastName}}</b>! 
    {{else}} 
     Welcome, <b>Guest</b>! 
    {{/if}} 
</script> 

我能夠通過運行App.myModel.set('name', 'Jane')改變firstName價值。但我很難改變lastName的價值。

如何實時修改lastName?而且,App.ApplicationController的實例在DOM中存儲在哪裏?

+0

我沒有任何東西存儲在使用Ember時在DOM中。你應該閱讀[guides](http://emberjs.com/guides/),特別是關於Ember的約定。你以一種看起來有問題的方式混合東西:你的'lastName'是一個字符串,你的'firstName'是綁定另一個對象中另一個屬性的觀察方式(這種方式並不是真正推薦的)。您應該將模型的實例傳遞給其控制器的內容屬性(最好通過路由),而不是在模型中已經表示的控制器中創建屬性。 – MilkyWayJoe 2013-03-18 20:16:58

回答

0

您是否試圖從模型中修改控制器的屬性?因爲這非常違背MVC的工作方式。 Your controller should be modifying your view。所以在這種情況下,您的lastName屬性應該存儲在您的模型中,而不是存儲在控制器上。

由於您直接綁定到模型中的屬性,因此您無法訪問模型本身。最好的辦法是綁定到對象,然後您可以訪問它的所有屬性:

firstNameBinding: "App.myModel"

,然後我們可以在App.myModel從控制器(this.set('firstName.someRandomProperty', 'Adam');)更改的所有屬性。

ApplicationController是一個對象,因此不會存儲在DOM中。 Ember使用concept of a factory method來提供對物體的訪問。例如,爲了獲得ApplicationController情況下,我們可以使用下面的,雖然,除非你真的確定你需要它,因爲實例都可以訪問更合乎邏輯的方式是不可取的:

this.container.lookup('controller:application')