我之前问过一个问题,我想将驻留在控制器中的集合绑定到列表场景视图,但是,我已经向我的结构添加了详细信息并编辑模板和视图,从而产生了几个额外的子路由:
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');
},[...]
contactController
正因为如此,我不得不创建contactController
一个新的控制器,因为contactsController
Ember找不到名为维护,同步可能出现的问题(编辑联系人时,我必须手动与 中的集合同步contactsController
)。此外,当我导航到/#/contacts/2/edit
它时会加载详细信息视图,因为我在.connectOutlet('contact')
. 所以我在做什么不可能是正确的。我不想为每个场景创建控制器。我确定这不是它的做法。
我还尝试设置视图(在我的情况下App.EditContactView
)而不是资源名称,connectOutlets
但我得到一个错误,说我可以传递“名称或视图类但不能同时传递”,但我没有通过viewClass
,而是作为connectOutlet
.
我还尝试将视图或视图实例设置为路由本身,我会破坏我的 JavaScript,或者在某些情况下我会收到一条错误消息,指出“ App.EditContactView 没有方法 CharAt ”。
话又说回来,我有点失落。我在 SO 和其他地方看到过其他问题,但我发现的问题要么ember-routermanager
由 Gordon Hempton 使用(这看起来不错,但我现在只对使用内置感兴趣),Ember.StateManager
或者不使用 state/route全部。文档还没有对这些事情进行太多解释。
问题:处理所有 CRUD 场景的理想方法是Ember.Router
什么?我希望我contactsController
能够列出所有、查找一个、编辑一个、添加一个和删除一个联系人。由于命名问题,现在我有一个contactsController
和findAll
一个contactController
, find
, 。edit
remove
add
我目前没有使用 ember-data,所以我会对没有引用 ember-data 的示例更感兴趣(我现在正在做没有任何插件的婴儿步骤)。
这是我的路由器的当前版本:
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>
注意:如果有任何不清楚的地方,请在评论部分询问,我可以编辑更多细节
编辑:我已经将此项目添加到GitHub,即使它与我想作为学习示例公开的内容相去甚远。目标是在此基础上取得进展并在不久的将来创建一个 CRUD 模板。目前使用 MS Web API,但可能很快会添加 Rails 版本。