控制器策略/垃圾收集(销毁)

问题描述:

试图找出关于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 =“此”}}

我这个重新写了几次...希望这是有道理的...

+0

你能显式地销毁基于一个事件? – 2012-04-06 15:31:43

+0

是的,我可以随时调用UserViewController.destroy()...所以我可以挂钩一些事件回调,如果这是它应该完成的方式 – 2012-04-06 15:37:54

+1

相关:http://*.com/questions/8664573 /关于典型行为的控制器在烬 – 2012-04-06 16:44:18

我不会将每个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); 
    } 
}); 
​ 
+0

这很有趣...我没有想到它是这样的 – 2012-04-06 16:20:00