我正在玩emberjs幾天了,並認爲我瞭解基礎知識。現在我試圖構建一個真實世界的應用程序,並且已經陷入了一個奇怪的問題。Emberjs控制器初始化
我想要一個應用程序模板,使用'視圖'助手包括一些其他視圖。我還希望有一些包含環境信息的「全局」模型(例如登錄用戶帳戶信息等),我希望能夠在不同的視圖中使用這些模型。
我嘗試這樣做:http://jsfiddle.net/UzgMd/7/
<script type="text/x-handlebars" data-template-name="header">
<div>Header {{fullName}}</div>
</script>
<script type="text/x-handlebars" data-template-name="sidebar">
<div>Sidebar</div>
</script>
<script type="text/x-handlebars" data-template-name="application">
<div>{{view App.HeaderView}}</div>
<div>{{view App.SidebarView}}</div>
</script>
<script type="text/javascript" src="http://code.jquery.com/jquery-1.9.1.min.js"></script>
<script type="text/javascript" src="https://raw.github.com/wycats/handlebars.js/1.0.0-rc.3/dist/handlebars.js"></script>
<script type="text/javascript" src="https://raw.github.com/emberjs/ember.js/release-builds/ember-1.0.0-rc.2.js"></script>
<script type="text/javascript" src="https://raw.github.com/MilkyWayJoe/cdnjs/master/ajax/libs/ember-data.js/0.12.00-latest20130328/ember-data-latest.js"></script>
具有以下JS:
App = Ember.Application.create();
App.Store = DS.Store.extend({
revision: 12,
adapter: 'DS.FixtureAdapter'
});
App.AccountInfo = DS.Model.extend({
firstName: DS.attr('string'),
lastName: DS.attr('string'),
fullName: function() {
return this.get('firstName') + ' ' + this.get('lastName');
}.property('firstName', 'lastName')
});
App.AccountInfo.FIXTURES = [{
id: 1,
firstName: "John",
lastName: "Doe"
}];
//App.headerController = Ember.ObjectController.extend({}).create(); // works
App.HeaderController = Ember.ObjectController.extend({}); // doesnt work
App.HeaderView = Ember.View.extend({
templateName: 'header',
//controller: App.headerController // works
controller: App.HeaderController.create() // doesnt work
});
App.SidebarView = Ember.View.extend({
templateName: 'sidebar'
});
App.ApplicationController = Ember.Controller.extend({});
App.ApplicationRoute = Ember.Route.extend({
model: function() {
return App.AccountInfo.find(1);
},
setupController: function(controller, model) {
this._super(controller, model);
//App.headerController.set('model', model); // works
this.controllerFor('header').set('content', model); // doesnt work
}
});
,但它不工作,因爲controllerFor() - 法線47倍的回報的一個新實例HeaderController而不是已經在第30行中創建的實例。如果我再次調用controllerFor(),則不會創建新實例,但會返回第47行調用創建的實例 - 我發現有點混亂。
但是,如果我不喜歡這樣寫道:http://jsfiddle.net/UzgMd/8/
App = Ember.Application.create();
App.Store = DS.Store.extend({
revision: 12,
adapter: 'DS.FixtureAdapter'
});
App.AccountInfo = DS.Model.extend({
firstName: DS.attr('string'),
lastName: DS.attr('string'),
fullName: function() {
return this.get('firstName') + ' ' + this.get('lastName');
}.property('firstName', 'lastName')
});
App.AccountInfo.FIXTURES = [{
id: 1,
firstName: "John",
lastName: "Doe"
}];
App.headerController = Ember.ObjectController.extend({}).create(); // works
//App.HeaderController = Ember.ObjectController.extend({}); // doesnt work
App.HeaderView = Ember.View.extend({
templateName: 'header',
controller: App.headerController // works
//controller: App.HeaderController.create() // doesnt work
});
App.SidebarView = Ember.View.extend({
templateName: 'sidebar'
});
App.ApplicationController = Ember.Controller.extend({});
App.ApplicationRoute = Ember.Route.extend({
model: function() {
return App.AccountInfo.find(1);
},
setupController: function(controller, model) {
this._super(controller, model);
App.headerController.set('model', model); // works
//this.controllerFor('header').set('content', model); // doesnt work
}
});
在我注入模型使用單控制器實例,一切工作正常。
現在我的問題:
- 是在controllerFor()創建一個新的實例的錯誤嗎?如果沒有,爲什麼它會這樣做,或者我做錯了什麼?
- 是我在第二把小提琴中合適的方式來做的方法,還是有更好的方法?
感謝您的時間和詳細的解釋。這樣做並不適合(手動創建控制器實例),但我無法找到任何有關DOS和不該做的事情。現在看來更清晰了,我會給渲染助手一個嘗試:)。再次感謝。 – Nic