我問了一個問題以前,我想bind a collection residing in the controller to the list scenario view,但是,我已經添加細節和編輯模板和意見,我的生產結構一對額外的子路線:Ember.js - CRUD場景 - 從路徑中指定查看
root.contacts.details -> /contacts/:contact_id
root.contacts.edit -> /contacts/:contact_id/edit
在我details
情景我第一次開始調用connectOutlets
如下
[...]
connectOutlets: function (router, contact) {
router.get('contactController').set('contact', contact);
router.get('applicationController').connectOutlet('contacts');
},[...]
這會改變在瀏覽器導航欄的路線,但它會加載相同的視圖,然後我改變了.connectOutlet
到接觸代替觸點以下
[...]
connectOutlets: function (router, contact) {
router.get('contactController').set('contact', contact);
router.get('applicationController').connectOutlet('contact');
},[...]
正因爲如此,我不得不創建一個新的控制器,因爲Ember無法找到名爲contactController
的控制器,所以我最終得到了contactController
和contactsController
,我認爲我打破了這樣做的MVC模式,以及創建一個額外的類來維護,同步可能出現的問題(編輯聯繫人時,我必須手動與contactsController
中的集合同步)。另外,當我導航到/#/contacts/2/edit
時,它會加載詳細信息視圖,因爲我在.connectOutlet('contact')
中使用了相同的名稱。所以我正在做的事情是不對的。我不想爲每個場景創建控制器。我相信這不是如何完成的。
我也試過在connectOutlets
設置視圖(在我的情況App.EditContactView
),而不是資源的名字,但我得到了一個錯誤,說我可以通過「名稱或viewClass類,但不能同時」但我不及格通過viewClass
,而不是作爲connectOutlet
的論點。
我也試圖設置一個視圖或我的視圖的實例路線本身,我會打破我的JavaScript或在某些情況下,我會得到一個錯誤,說「App.EditContactView沒有方法CharAt「。
然後我又有點迷路了。我在SO上看到過其他問題,除此之外,我發現使用Gordon Hempton的ember-routermanager
(這看起來不錯,但我只對現在使用內置感興趣),Ember.StateManager
或者沒有使用state /在所有路線。文檔沒有太多解釋這些事情。
問題:用Ember.Router
來處理所有CRUD場景的理想方法是什麼? 我希望我的contactsController
能夠列出全部,找到一個,編輯一個,添加一個並刪除一個聯繫人。現在我有一個contactsController
與findAll
和一個contactController
與find
,edit
,remove
,add
由於命名問題。
我目前沒有使用燼數據,所以我會更感興趣的例子沒有引用燼數據(我現在做沒有任何插件的嬰兒步驟)。
這裏是我的路由器的當前版本:
JS
App.Router = Ember.Router.extend({
enableLogging: true,
location: 'hash',
root: Ember.Route.extend({
// EVENTS
gotoHome: Ember.Route.transitionTo('home'),
gotoContacts: Ember.Route.transitionTo('contacts.index'),
// STATES
home: Ember.Route.extend({
route: '/',
connectOutlets: function (router, context) {
router.get('applicationController').connectOutlet('home');
}
}),
contacts: Ember.Route.extend({
route: '/contacts',
index: Ember.Route.extend({
route: '/',
contactDetails: function (router, context) {
var contact = context.context;
router.transitionTo('details', contact);
},
contactEdit: function (router, context) {
var contact = context.context;
router.transitionTo('edit', contact);
},
connectOutlets: function (router, context) {
router.get('contactsController').findAll();
router.get('applicationController').connectOutlet('contacts', router.get('contactsController').content);
}
}),
details: Ember.Route.extend({
route: '/:contact_id',
view: App.ContactView,
connectOutlets: function (router, contact) {
router.get('contactController').set('contact', contact);
router.get('applicationController').connectOutlet('contact');
},
serialize: function (router, contact) {
return { "contact_id": contact.get('id') }
},
deserialize: function (router, params) {
return router.get('contactController').find(params["contact_id"]);
}
}),
edit: Ember.Route.extend({
route: '/:contact_id/edit',
viewClass: App.EditContactView,
connectOutlets: function (router, contact) {
router.get('contactController').set('contact', contact);
router.get('applicationController').connectOutlet('contact');
},
serialize: function (router, contact) {
return { "contact_id": contact.get('id') }
},
deserialize: function (router, params) {
return router.get('contactController').find(params["contact_id"]);
}
})
})
})
});
App.initialize();
相關模板
<script type="text/x-handlebars" data-template-name="contact-details">
{{#if controller.isLoaded}}
<img {{bindAttr src="contact.imageUrl" alt="contact.fullName" title="contact.fullName"}} width="210" height="240" /><br />
<strong>{{contact.fullName}}</strong><br />
<strong>{{contact.alias}}</strong>
{{else}}
<img src="images/l.gif" alt="" /> Loading...
{{/if}}
</script>
<script type="text/x-handlebars" data-template-name="contact-edit">
<strong>Edit contact</strong><br />
First Name: <input type="text" id="txtFirstName" {{bindAttr value="contact.firstName"}}<br />
Lasst Name: <input type="text" id="txtLastName" {{bindAttr value="contact.lastName"}}<br />
Email: <input type="text" id="txtEmail" {{bindAttr value="contact.email"}}<br />
</script>
<script type="text/x-handlebars" data-template-name="contact-table-row">
<tr>
<td>
<img {{bindAttr src="contact.imageUrl" alt="contact.fullName" title="contact.fullName"}} width="50" height="50" /><br />{{contact.fullName}}
</td>
<td>
Twitter: {{#if contact.twitter}}<a {{bindAttr href="contact.twitter"}} target='_blank'>Follow on Twitter</a>{{else}}-{{/if}}<br />
</td>
<td>
<a href="#" {{action contactDetails context="contact"}}>Details</a> |
<a href="#" {{action contactEdit context="contact"}}>Edit</a>
</td>
</tr>
</script>
注意:如果有什麼不清楚的地方,請諮詢中評論部分,我可以e DIT這更多的細節
編輯:我已經添加了這個項目GitHub即使壽它遠不及希望我揭露作爲一個學習的樣本。目標是在此基礎上取得進展,並在不久的將來創建一個CRUD模板。目前使用MS Web API,但很快可能會添加Rails版本。
我得到一個404鏈接到Github頁面。最近這個變化了嗎? – mkelley33 2012-09-24 05:31:22
是的..我改變了項目名稱。這裏是[新鏈接](https://github.com/MilkyWayJoe/hello-ember-router) – MilkyWayJoe 2012-09-24 13:16:28
謝謝@MilkyWayJoe – mkelley33 2012-09-24 22:46:50