在ember的official guide中,他们说可以使用视图删除记录,但是他们没有提供如何操作的示例。我无法理解视图如何获取对象的id做毁灭。 也许我不明白什么是观点目的?我认为这是一个事件处理程序(但有时我会看到它用于渲染大块的hbl ...也许这就是为什么我很困惑)
是否有任何地方删除整个过程的例子?
谢谢
答案 0 :(得分:3)
通常,您要做的是在视图中创建一个{{action}}
,将事件发送到实际应该处理的位置:控制器或路径。 (就我而言,两者都有)
注意:通常,您不需要为模板编写View
类,除非视图需要特定的事件处理程序。 Ember在运行中生成通用视图 。您可以通过{{log view}}
:
<script type="text/x-handlebars" data-template-name="app">
{{log view}}
</script>
如果查看控制台,您会发现模板app
与视图类相关联:
例如,在以下视图模板中,我定义了一个&#34;删除&#34;按钮,它将触发控制器中的操作remove
。
<script type="text/x-handlebars" data-template-name="product/remove">
<fieldset>
<legend>Remove</legend>
<div class="row-fluid">
Are you sure you want to delete <strong>{{content.name}}</strong>?
</div>
</fieldset>
<ht />
{{#linkTo products class="btn"}}Back to List{{/linkTo}}
<button {{action remove target="controller"}} class="btn btn-danger">
Delete
</button>
</script>
控制器只获取content
属性并发出路由以触发confirmRemove
事件,并将其content
作为参数传递
App.ProductRemoveController = Em.ObjectController.extend({
remove: function() {
this.get('target').send('confirmRemove', this.get('content'));
}
});
这条路线实际上是这样处理的:
App.ProductRemoveRoute = Em.Route.extend(App.NotifyHandler, {
setupController: function(controller, model) {
var c = this.controllerFor('product');
controller.set('content', c.get('content'));
},
events: {
confirmRemove: function(record) {
record.deleteRecord();
// should commit here
// this.get('store').commit();
this.controllerFor('application').set(
'notification', 'Product has been removed'
);
this.transitionTo('products');
}
}
});
(见fiddle)
如果你想直接在Route中处理事件,而不与控制器交谈,在你的视图模板中,你只需省略target="controller"
,框架将在该框架中查找该事件的处理程序。控制器,如果找不到,它将look up in the route。在这种方法中,如果需要任何参数,则有通过Handlebars传递事件参数。在这种情况下,我知道this
代表该模板中的content
:
<script type="text/x-handlebars" data-template-name="product/remove">
<fieldset>
<legend>Remove</legend>
<div class="row-fluid">
Are you sure you want to delete <strong>{{content.name}}</strong>?
</div>
</fieldset>
<ht />
{{#linkTo products class="btn"}}Back to List{{/linkTo}}
<button {{action confirmRemove this}} class="btn btn-danger">
Delete
</button>
</script>
使用这种方法,您不需要在控制器中定义任何内容,因为它会直接在路径中触发事件:
App.ProductRemoveController = Em.ObjectController.extend();
(见fiddle)
更新:为了在对象控制器中处理事件,itemController
属性必须指定一个控制器,该控制器应该扩展Em.ObjectController
:
Depot.TransportDocumentsController = Ember.ArrayController.extend
itemController: 'transportDocument'
Depot.TransportDocumentController = Ember.ObjectController.extend
removeItem: ->
alert("aoooo")
在模板中唯一可以改变的是在itemController
帮助器中提到{{each}}
:
{{#each doc in controller itemController="transportDocument"}}
{{doc.number}}
<!-- rest of the template removed to make this short. -->
<button {{action removeItem}} class='btn btn-danger btn-small'>
<i class="icon-white icon-remove"></i>
</button>
{{/each}}
在操作中,您不需要说出处理程序所在的位置,因为框架本身可以find the target。
(见fiddle)