1

我正在编写一个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}}

然后在我的路由器中,editCommentandcancelEditingComment动作将委托给Comment,它具有以下功能:

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

我不禁认为我做错了什么,尽管这种代码似乎有效。

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

4

1 回答 1

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);
    }
});
于 2012-12-05T10:51:07.247 回答