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

2023-12-31

试图找出我的应用程序关于 MVC 的“ember 最佳实践”。另外供参考,我正在使用 ember-data、ember-layout 和 ember-route-manager。

我将以用户为例:

我觉得我想做的是从数据库中获取用户模型...然后将其包装在 UserController 中,并将模型设置在“内容”属性上...然后在视图中,我想绑定到这控制器对于某些功能,以及控制器.内容对于模型级数据。所以控制器可能看起来像:

App.UserViewController = Em.Object.create({   
    content: userRecord,
    isFollowingBinding : 'content.you_follow', 
    toggleFollow: function() { 
       make server call to change following flag 
    }
});

那么视图可以绑定到{{controller.content.name}}, or {{#ifcontroller.isFollowing}}, or {{action "toggleFollowing" target="controller"}}

但是假设我从数据库中得到了用户模型的列表......我觉得什么should发生的情况是每个模型都应该用控制器包装,并且that应该作为列表返回...所以视图将有一个 UserController 列表

顺便说一句,我已经做到了这一点......而且它工作得很好......除了每次重新加载列表时,我都会用新控制器包装所有新模型对象......随着时间的推移,控制器的数量内存越来越大。在我的基本控制器类上,我正在记录对“销毁”的调用,但我没有看到它发生

当谈到 Em.View...我知道每次它从屏幕上删除时,.destroy() 都会收到调用(我也正在记录这些调用)。因此,如果我要将代码移至视图中,我知道它每次都会被销毁并重新创建...但我不认为像toggleFollow() 这样的功能应该在视图中...

所以问题:

  • 这是 MVC 应该如何工作的吗?模型的每个实例都包含在该模型的控制器中?哪里可以为一个屏幕创建大量控制器实例?
  • 如果我采用这种方法,那么我负责 destroy() 我创建的所有控制器?
  • 或者我上面描述的功能实际上是针对视图的,当它们从屏幕上添加/删除时,Ember 会创建/销毁它们?还允许模板设计者决定他们需要什么功能(如果他们只需要{{用户名}},不需要实例化另一个控制器/视图类...但是如果他们需要“切换”按钮,那么他们可以将模板的该部分包装在{{#view App.UserViewController contentBinding="this"}} )

我重写了几次……希望它有意义……


我不会包装每一个user到自己的控制器中。

相反,我会将用户绑定到视图,例如App.UserView并处理动作toggleFollow就这个观点而言。然后,此操作会将其操作委托给控制器,该控制器将处理服务器调用,请参阅http://jsfiddle.net/pangratz666/hSwEZ/ 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);
    }
});
​
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

控制器策略/垃圾收集(销毁) 的相关文章

随机推荐