【问题标题】:How to avoid reentrancy in AngularJS?如何避免AngularJS中的重入?
【发布时间】:2015-01-11 01:30:58
【问题描述】:

Bootstrap selectpicker 隐藏原始选择并创建附加元素,用来自选择的选项填充它。但是,当使用 ngOptions 时,selectpicker 不会自动更新。

所以我创建了一个指令来监听 ngOptions 集合的变化并调用element.selectpicker()

如果没有对 ngOptions 应用过滤,它可以正常工作。否则,每次调用 filering 函数时都会返回新数组,这会导致 $watch 回调触发,从而重新创建 selectpicker。 Angular 检测到 DOM 已更改并开始新的摘要循环,从而有效地无限循环该过程。在 10 次迭代后,Angular 会按预期抛出异常。

我需要在创建 selectpicker 时暂时取消订阅手表,然后在摘要周期完成后再次订阅。有可能吗?

更新1

想多了,现在有一个想法可以尝试。 Filter 定义了一个工厂返回过滤函数,因此我可以使用捕获的数组来存储过滤后的内容 - 引用不会改变,因此监听器只会在集合内容发生变化时触发。

【问题讨论】:

  • 我知道这并不完全是您问题的答案,但您总是可以为您的下拉菜单选择自定义路线并完全避免问题......再次,无耻(开始变得可耻)插头 -_- matterickson.me/dropdowns_selectboxes

标签: javascript angularjs twitter-bootstrap angularjs-directive reentrancy


【解决方案1】:

关于暂时停止观看:

$watch 总是返回 unwatch 函数 afaik:

var stopW = $scope.$watch('data', process);
stopW(); //anywhere

还有一些小建议。有时您不想在观看时比较“===”。
尝试使用函数,检测到任何变化:

$watch(function(){return $scope.data.list;}, process);

甚至:

$watch(function(){return JSON.stringify($scope.data);}, process);

最后一个应该完全忽略过滤器重新创建的数组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-27
    • 1970-01-01
    • 2016-06-30
    • 2015-10-07
    相关资源
    最近更新 更多