【问题标题】:Content of select items is not set when reloading using ng-repeat使用 ng-repeat 重新加载时未设置所选项目的内容
【发布时间】:2015-12-12 17:06:12
【问题描述】:

我有一个代码,可以在按下按钮时使用ng-repeat 创建一对选择和输入元素。元素在单独的指令中定义:

<select ng-model="rule.parameter" ng-options="sel1.name for sel1 in selects1" ng-change="change(rule.parameter)"></select>

可以通过按下控制器部分的按钮将数据保存到参数$scope.mydata

<button ng-click="save(myselects)">Save data</button>

js代码如下:

$scope.save = function(filter) {
    $scope.mydata = JSON.stringify(filter, null, 2);    
};

现在假设我们已经将来自$scope.mydata 的数据保存在一个文件中(参见Fiddle 中的mydata.txt)。当用户按下另一个按钮来取回数据时,应该会再次生成并显示元素:

<button ng-click="getData()">Get data</button>

用 JavaScript 编写代码来获取数据:

$scope.getData = function() {
    $http({
      method: 'GET',
      url: 'mydata.txt'
    }).success(function(data) {
      if (data != null && data != "") {
        $scope.myselects = data;        
      }
    });
};

我的问题是,当我单击该按钮时,未设置选择框中的元素。输入字段的内容已设置,但两个选择框的内容未设置。

谁能帮我解决这个问题?

完整的 Fiddle 是 here。只需单击 Get data 按钮(mydata.txt 中已有一些内容)。

提前谢谢!

【问题讨论】:

    标签: javascript html angularjs angularjs-ng-repeat


    【解决方案1】:

    默认情况下,ngModel 通过引用而不是值来监视模型。

    当您从 mydata.txt 加载数据时,第一个选择的模型 (rule.parameter) 将是:

    {"name":"Item1","relation":"default"}
    

    选项数组将包含一个看起来相同的项目,但它仍然是另一个对象。

    例如,这将记录false:

    var object1 = {"name":"Item1","relation":"default"};
    var object2 = {"name":"Item1","relation":"default"};
    
    console.log(object1 === object2);
    

    一种解决方案是使用track by 来通过属性值来标识对象。请注意,您选择的属性值必须是唯一

    例如:

    <select ng-model="rule.parameter" 
            ng-options="sel1.name for sel1 in selects1 track by sel1.name" 
            ng-change="change(rule.parameter)"></select>
    

    要使第二个选择正常工作,您不仅需要在更改第一个选择的选定值时构建过滤数组,还需要在初始化时构建过滤数组。

    例如,在dynamicSelectPair的链接函数中添加如下:

    if (scope.rule.parameter) scope.change(scope.rule.parameter);
    

    演示: http://plnkr.co/edit/ANWhMcUh86MSeOi3WCV3?p=preview

    【讨论】:

    • 另一个问题@tasseKATT:当我嵌套了这样的重复元素时,我该怎么办:Updated Plunker。当我点击get Data按钮时嵌套组的关系没有设置(点击按钮两次加载数据)。我必须提供 $index 吗?
    • 这是否按预期工作? plnkr.co/edit/TOoqnCkF5NScoaHPKl8B?p=preview 我只有几分钟的时间来看看它。如果不是,我会在今晚有更多时间的时候再看一看。
    • 您好,不,很遗憾不是。未设置缩进的四个 ng-repeat 元素的每个第二个选择框中的数据。当我输出{{filteredselect2}} 的内容时,缩进/嵌套选择框的相应数组为空。我不知道为什么:(
    • 问题是dynamicSelectPair 中的$scope.change 函数将在dynamicSelect 的$http 调用完成之前运行,这意味着scope.selects2 将为空。解决它的一种方法是防止指令在数据可用之前编译&lt;div dynamic-select-pair ng-if="selects1.length &amp;&amp; selects2.length" (plnkr.co/edit/qYWqNFYQA7KFJLbjya3S?p=preview)。另一种是使用$watch 调用$scope.change,例如当selects2 的长度发生变化时(plnkr.co/edit/iu3OPKv5ILFGowTwEamI?p=preview
    • 我想我会选择带有$watch 的版本。非常感谢您的时间-您为我节省了几个小时! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-27
    • 2016-08-20
    • 2013-10-07
    • 2014-08-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多