ember.js:如何使用视图删除记录

时间:2013-04-11 08:28:32

标签: event-handling ember.js

在ember的official guide中,他们说可以使用视图删除记录,但是他们没有提供如何操作的示例。我无法理解视图如何获取对象的id做毁灭。 也许我不明白什么是观点目的?我认为这是一个事件处理程序(但有时我会看到它用于渲染大块的hbl ...也许这就是为什么我很困惑)

是否有任何地方删除整个过程的例子?

谢谢

1 个答案:

答案 0 :(得分:3)

通常,您要做的是在视图中创建一个{{action}},将事件发送到实际应该处理的位置:控制器或路径。 (就我而言,两者都有)


注意:通常,您不需要为模板编写View类,除非视图需要特定的事件处理程序。 Ember在运行中生成通用视图 。您可以通过{{log view}}

查看此信息
<script type="text/x-handlebars" data-template-name="app">
    {{log view}}
</script>

如果查看控制台,您会发现模板app与视图类相关联:

enter image description here


例如,在以下视图模板中,我定义了一个&#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