javascript - AngularJS ng-repeat 未检测到使用 ng-include 动态生成的数组

标签 javascript angularjs ng-dialog

问题

我发现 ng-repeat 指令无法跟踪新数组的添加。
在我的示例中,新数组是“选项”。
该指令是使用 ng-dialog(第 3 方库)显示的模板的一部分。
如果我关闭对话框并再次打开它,ng-repeat 将拾取我在关闭它之前所做的更改。

我尝试过 $scope.$apply();但我收到一条警告,表明它已经在运行。

更新++

我最终使用的解决方案是在 ng-init 上添加一个函数来首先检查该数组是否存在,如果不存在则创建它,然后将其分配给新变量。

这是一个更深入的示例,
写这篇 jsFiddle 已经指出问题出在 ng-include/ng-repeat 中 - 没有这个也没关系。 <罢工> http://jsfiddle.net/20mobk2h/56/
http://jsfiddle.net/20mobk2h/61/

ng-repeat 在一个名为 options 的数组上循环,该数组可能存在也可能不存在。

<div ng-init="options = element.options">
    <div ng-repeat="option in options" ng-include="'optionsTree'"></div>
</div>

我添加一个新选项:

$scope.addItem = function(item) {

    if(!item.options){
        item.options = [];
    }

    var obj = {
        val: 'blah'
    };

    item.options.push(obj);
}

最佳答案

更改此代码:

<div ng-init="options = item.options">
    <div ng-repeat="option in options" ng-include="'nest_options'"></div>
</div>

对此:

<div>
    <div ng-repeat="option in item.options" ng-include="'nest_options'"></div>
</div>

这里的问题是,当您将 item.options 分配给新变量 options 时,您会中断对 item 对象的引用,因为对于第一个时间(当 item.options未定义 时)选项为 未定义,原始值在 Javascript 中按值传递。因此,稍后当您更改 options 属性(通过添加新的数组元素)时,此更改不会反射(reflect)在 options 变量中。

但是当你第二次打开弹出窗口时,item.options不再是undefined,它已经是一个对象(数组),所以赋值options = item.options 结果变成普通对象引用,并且对 item.options 的更改反射(reflect)在 item 中。

演示:http://jsfiddle.net/20mobk2h/57/

关于javascript - AngularJS ng-repeat 未检测到使用 ng-include 动态生成的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26233726/

相关文章:

javascript - 如何设置输入值 ="color"

node.js - nginx 配置 - 将 http 转发到 https,将 www.domain.tld 转发到 domain.tld 和两个子域

javascript - jQuery 延迟回调的参数是什么?

javascript - 将闭包转换为 es6 模块

javascript - 无法在 angularjs 应用程序上通过 ngFacebook 登录 Facebook

javascript - 使用 ng-class 有条件地添加 CSS3 动画

html - ngDialog - closeModal 事件 - angularjs

javascript - ngDialog 模式不弹出

angularjs - Jwplayer - 错误 : jwplayer(. ..).setup 不是函数

javascript - 在javascript中,有没有办法将url转换为data-url?