试图找出我的应用程序的“余烬最佳实践”,关于MVC。也供参考,我使用的是ember-data,ember-layout和ember-route-manager。
我将以用户为例:
我想要做的是从数据库中获取用户模型...然后将其包装在UserController中,并在“内容”属性上设置模型...然后在视图中,我想要绑定到控制器以获取某些功能,并绑定到 controller.content 以获取模型级数据。所以控制器可能看起来像:
App.UserViewController = Em.Object.create({
content: userRecord,
isFollowingBinding : 'content.you_follow',
toggleFollow: function() {
make server call to change following flag
}
});
然后视图可以绑定到 {{controller.content.name}} ,或 {{#if controller.isFollowing}} 或 { {action“toggleFollowing”target =“controller”}}
但是说我从数据库中得到了一个用户模型列表...我觉得应该发生的是每个模型应该用控制器包装,那个应作为列表返回...因此视图将包含UserControllers列表
顺便说一句,我已经完成了这个...并且它运行良好....除了每次重新加载列表时,我用新控制器包装所有新模型对象......随着时间的推移,#内存中的控制器越来越大。在我的基础控制器类上,我正在记录“销毁”的调用,我没有看到它发生过
说到Em.View ...我知道每次从屏幕上删除它时,.destroy()都会调用它(我也会记录它们)。所以,如果我将我的代码移动到一个视图中,我知道它会被破坏并每次都重新创建......但我不觉得像toggleFollow()这样的功能应该在视图中......
所以问题:
我重写了几次......希望它有道理......
答案 0 :(得分:3)
我不会将每个user
都包装到自己的控制器中。
相反,我会将用户绑定到一个视图,比如App.UserView
并在该视图上处理操作toggleFollow
。然后,此操作会将其操作委派给将处理服务器调用的控制器,请参阅http://jsfiddle.net/pangratz666/hSwEZ/
<强>车把强>:
<script type="text/x-handlebars" >
{{#each App.usersController}}
{{#view App.UserView userBinding="this" controllerBinding="App.usersController"}}
{{user.name}}
{{#if isFollowing}}
<a {{action "toggleFollowing"}} class="clickable" >stop following</a>
{{else}}
<a {{action "toggleFollowing"}} class="clickable" >start following</a>
{{/if}}
{{#if user.isSaving}}saving ...{{/if}}
{{/view}}
{{/each}}
</script>
<强>的JavaScript 强>:
App.usersController = Ember.ArrayProxy.create({
content: [],
toggleFollowing: function(user) {
user.set('isSaving', true);
Ember.run.later(function() {
user.toggleProperty('you_follow');
user.set('isSaving', false);
}, 1000);
}
});
App.UserView = Ember.View.extend({
isFollowingBinding: 'user.you_follow',
toggleFollowing: function() {
var user = this.get('user');
var controller = this.get('controller');
controller.toggleFollowing(user);
}
});