【问题标题】:Ember.js itemController controller leaking variableEmber.js itemController 控制器泄漏变量
【发布时间】:2014-05-15 04:23:31
【问题描述】:

我有一个 itemController,它有两个字段:isExpandednewCommentisExpanded 工作得很好并且绑定到每个 itemController,但是 newComment 以某种方式被 itemController 的所有实例共享。而且只会第一次分享。在我提交新评论后,该 textarea 不再与其他 textarea 共享相同的绑定,但其余的 textarea 仍然神秘地绑定到同一个 ghost newComment。为什么?

http://emberjs.jsbin.com/gojuhega/1/edit

[1]上一个问题已删除并隔离到此 jsbin。

【问题讨论】:

    标签: javascript ember.js handlebars.js


    【解决方案1】:

    似乎当基于DiscussionController原型创建新控制器时,它的属性是浅拷贝的。由于您的 newComment 是引用类型,因此您最终会得到 3 个控制器,它们都共享同一个实例。只有当您单击“创建”时,各个控制器才会获得自己的实例。

    一种可能的解决方案:

    App.DiscussionController = Ember.Controller.extend({
      isExpanded: false,
    
      newComment: null,
      actions: {
        toggleExpand: function(){
          this.toggleProperty('isExpanded');
          if (!this.get("newComment")) {
            this.set("newComment", {body:""});
          }
        },
        createComment: function() {
          this.set('newComment', {
            body: ''
          });
        }
      }
    });
    

    【讨论】:

    • 另一种解决方案是使用init 为每个实例设置默认值(不过不要忘记调用this._super())。
    • 谢谢大家! Christoffer 还在 ember.discuss 上引用了这个问题以获得完整的解释:github.com/emberjs/ember.js/issues/462
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-06
    • 2013-10-13
    • 2013-01-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多