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

时间:2012-04-06 15:30:04

标签: ember.js

试图找出我的应用程序的“余烬最佳实践”,关于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()这样的功能应该在视图中......

所以问题:

  • 这是MVC应该如何工作的?包含在该模型的控制器中的模型的每个实例?哪个可能会为一个屏幕创建大量的控制器实例?
  • 如果我采用这种方法,那么我负责销毁()我创建的所有控制器?
  • 或者我上面描述的功能是否真的适用于View,而Ember会在屏幕上添加/删除它们时创建/销毁它们?还允许模板设计人员决定他们需要什么功能(如果他们只需要 {{user.name}} ,则无需实例化其他控制器/视图类......但如果他们需要“切换“按钮,然后他们可以将模板的那部分包装在 {{#view App.UserViewController contentBinding =”this“}} )中

我重写了几次......希望它有道理......

1 个答案:

答案 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);
    }
});
​