在这种情况下使用Ember.js控制器的正确方法是什么?

时间:2012-12-05 08:03:37

标签: model-view-controller ember.js

我正在编写一个Ember.js应用,以显示从CRUD RESTful API获取的嵌套注释列表。

中途,我意识到我可能在滥用Ember.js并且没有利用其范例。

例如,我的Comment对象如下所示:

App.Comment = Em.Object.extend({
  id: null,
  author: null,
  text: null,

  delete: function() { /* AJAX call to API here */ }
});

是否可以将delete()函数作为模型对象的一部分而不是控制器?

我的另一个疑问是处理国家问题。在我的模板中,我做了类似的事情:

{{#if view.comment.editing}}
    {{view Ember.TextArea valueBinding="view.comment.text"}}
    <a href="#" {{action cancelEditingComment}}>Cancel</a>
{{else}}
    <p>{{view.comment.text}}</p>
    <a href="#" {{action editComment}}>Edit</a>
{{/if}}

然后在我的路由器中,editCommentcancelEditingComment操作将委托给Comment,其中包含以下功能:

startEditing: function() { this.set('editing', true); }
cancelEditing: function() { this.set('editing', false); }

我不禁想到我做错了什么,虽然这种代码似乎有效。

您对如何重新组织我的代码以及任何可能对我有帮助的推荐阅读有任何建议吗?

1 个答案:

答案 0 :(得分:2)

根据我的经验,您的模型不应该有任何业务逻辑。如果你有一些可以生成的复杂字段,它应该只有一组字段和一些计算属性。

您委托给控制器的视图绝对是删除的正确方法。当谈到编辑时,看到它只是关注这个(通常)的视图,我倾向于将isEditing部分视图本身。然后,您可以检查此标志以决定是否绘制简单文本或文本区域以进行输入。

App.controller = Em.Object.create({
    comments: [],

    deleteComment: function(comment) {
        this.get('comments').removeObject(comment);
    }
});

App.CommentView = Em.View.extend({
    comment: null,
    isEditing: null,

    delete: function() {
        App.controller.deleteComment(this.get('comment'));
    },

    startEditing: function() {
        this.set('isEditing', true);
    }
});