3

我有一个动态 div,它有条件地推入 dom。我有一个 ng-click 事件绑定到触发 myfunc() 的 div 内的子元素。现在,当该 div 被删除并重新添加到 dom 时, myfunc() 被触发两次。myfunc 被称为 div 被删除和重新添加的次数。看起来我甚至需要在子元素上取消绑定 ng-click。

 <div gm-info-window="infoWindow" gm-on-closeclick="infoWindowClosed()"> 
        <div> 
          <b>{{category}}</b>
          <p>{{subcategory}}</p>
          <b ng-show="dateString != null"> {{dateString}}</b>
          <p >{{place}}</p>
          <a ng-show="hasDescription != false" ng-click="myfunc()">View Description</a>
        </div>
</div>
4

1 回答 1

0

使用 $compile 动态插入 dom 可能会导致内存泄漏。现有的 dom 可以用新的 dom 元素替换,而与旧 dom 关联的范围仍然存在,这意味着所有的监视和事件侦听器仍然存在。

安全的方法是:

  1. 为我们要动态插入的 dom 创建一个新的子作用域。
  2. 检查 dom 是否会替换现有的。并首先销毁与其关联的现有范围。
  3. 使用新的子作用域作为参数编译新的 dom。

像这样的东西:

var newScope = parentScope.$new(),      //parentScope is the scope you are going to add dom under it
    $el=$(content);  

if ($el) {                              //same dom already exist?
    var existingScope = $el.scope();    //any scope associated?

    if (existingScope) {
          existingScope.$destroy();
    }
}
$compile(content)(newScope);

参考资料:http ://roubenmeschian.com/rubo/?p= 51 http://makandracards.com/makandra/15851-angularjs-access-the-scope-for-a-rendered-dom-element

于 2015-03-19T18:19:08.410 回答