控制器策略/垃圾收集(销毁)
试图找出关于MVC的我的应用程序的“最佳实践”。也供参考,我使用的是ember-data,ember-layout和ember-route-manager。控制器策略/垃圾收集(销毁)
我将使用用户为例:
什么,我觉得像我想要做的是从数据库中获取用户模型......然后在UserController的纸包起来,然后设置模型上“内容”属性...然后在View中,我想绑定到控制器的某些功能,以及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}},或{{#如果controller.isFollowing}},或{ {行动“toggleFollowing”目标=“控制器”}}
,但说我得到的用户模型的列表从数据库返回的...我觉得像什么应该出现的情况是,每机型的应包带控制器,即 s应该作为一个列表返回...所以视图将有一个UserControllers列表
顺便说一句,我已经这样做......它工作很好....除了每次我重新加载列表,我用新的控制器包装所有的新模型对象......随着时间的推移,内存中的控制器越来越大。在我的基地控制器类,我记录呼叫“摧毁”,我没有看到它曾经发生过
当涉及到Em.View ...我知道,每次它从屏幕上删除,.destroy ()获取调用(我也记录这些)。所以如果我要将我的代码移动到视图中,我知道它会被破坏并每次都被重新创建......但我不认为toggleFollow()的功能应该在视图中...
问题:
- 这是MVC应该如何工作?包装在该模型的控制器中的每个模型实例?哪里可以为一个屏幕创建大量的控制器实例?
- 如果我采用这种方法,那么我负责销毁所有我创建的控制器?
- 或者我上面描述的功能对于View来说真的意味着什么,他们Ember会在屏幕添加/删除时创建/销毁它们?还允许模板设计人员决定他们需要什么功能(如果他们只需要使用其他控制器/视图类别,则不需要实例化其他控制器/视图类别,但是如果他们需要“切换”按钮,则他们可以换模板的那部分{{#view App.UserViewController contentBinding =“此”}})
我这个重新写了几次...希望这是有道理的...
我不会将每个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);
}
});
这很有趣...我没有想到它是这样的 – 2012-04-06 16:20:00
你能显式地销毁基于一个事件? – 2012-04-06 15:31:43
是的,我可以随时调用UserViewController.destroy()...所以我可以挂钩一些事件回调,如果这是它应该完成的方式 – 2012-04-06 15:37:54
相关:http://*.com/questions/8664573 /关于典型行为的控制器在烬 – 2012-04-06 16:44:18