2012-12-05 59 views
1

我正在编写一个Ember.js应用程序来显示从CRUD RESTful API中提取的嵌套注释列表。在这种情况下使用Ember.js控制器的正确方法是什么?

过了半路,我意识到我可能会误用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); } 

我不禁想,我做错了什么,虽然这种代码似乎工作。

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

回答

2

从我的经验来看,你的模型应该没有任何商业逻辑。如果你有一些可以生成的复杂字段,它应该只有一组字段,也许还有一些计算属性。

您的视图委托给您的控制器绝对是删除的正确举措。当涉及到编辑时,虽然只是真正关注这个(通常)的视图,但我倾向于使视图本身成为其中的一部分。然后你可以检查这个标志来决定是否绘制简单的文本或者输入一个textarea。

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); 
    } 
}); 
+0

谢谢,这听起来不错。我试图从'Comment'将'isEditing'逻辑移动到我的视图中,但编辑逻辑位于我的控制器中(我认为它应该)。当我在控制器中时,我不能执行'this.get('view')。set('isEditing',true);'我该怎么做?也许可以更改我的路由器,以便将“操作”委派给视图,然后再委托给控制器? –

+0

在您的视图中添加“isEditing”是基于您只是在改变渲染方式的假设。对不起,我应该更清楚了。我可能只是将该字段移回到您的评论,但一定要从控制器而不是模型本身进行设置。 – Drew

+0

你的假设是正确的:我*只*改变它的渲染方式,所以我确信'isEditing'属于视图。您可以评论我是否应该首先将操作委托给视图,或者先将控制器委托给路由器? –

相关问题