我遵循了 Ember.js 上的 PeepCode 教程,并将其扩展为从选项卡中删除项目。我还在服务器上实现了一个简单的 RESTful 接口来持久化更改,并且正在使用 DS.RESTAdapter。
有2个相关模型:
- 选项卡项
- Tab,与 TabItem 具有 hasMany 关系
继本教程之后,我向选项卡模板添加了一个简单的删除链接:
<script type="text/x-handlebars" data-template-name="tab">
<ul id="customer-tab">
{{#each tabItem in tabItems}}
<li>
<h3><a href="#" {{ action "removeTabItem" tabItem }}>x</a> {{ tabItem.food.name }} <span>{{ money tabItem.cents}}</span></h3>
</li>
{{ else }}
<li><h3>Click a food to add it</h3></li>
{{/each}}
<li id="total">
<h3>Total <span>{{ money cents }}</span></h3></li>
</li>
</ul>
</script>
并且在控制器中
App.TabController = Ember.ObjectController.extend({
removeTabItem: function(tabItem) {
var store = this.get('store');
store.transaction();
var t = store.find(App.TabItem,tabItem.get('id'));
t.deleteRecord();
this.get('tabItems').removeObject(tabItem);
store.commit();
}
});
上面的控制器代码是我通过一些反复试验和猜测完成的。“removeObject”调用似乎是从用户界面中正确删除项目所必需的,并且“deleteRecord”调用似乎是必要的,因此“commit”将导致对服务器的DELETE调用。
不过,控制器代码似乎有点冗长,我怀疑我遗漏了一些东西。有没有一种被认为更好的方法,可能更直接地使用“tabItem”,并且使用更少的 API 调用?