Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Angular JS将选项添加到ng上的下拉菜单单击无法正常工作_Javascript_Angularjs_Angularjs Scope - Fatal编程技术网

Javascript Angular JS将选项添加到ng上的下拉菜单单击无法正常工作

Javascript Angular JS将选项添加到ng上的下拉菜单单击无法正常工作,javascript,angularjs,angularjs-scope,Javascript,Angularjs,Angularjs Scope,我对angularJS非常陌生。我正在尝试为用户创建一个界面,用户可以从两个下拉列表中选择两个项目。它们实际上是相同的选项。当用户从左侧下拉列表中选择某个选项时,他将无法从右侧下拉列表中选择相同的选项,反之亦然。用户还将有一个按钮来添加更多选项。这段代码在任何情况下都可以正常工作,但是当用户单击按钮添加更多选项时,新添加的选项根本不起作用。 这是我的全部代码: <html> <head> <script src="https://cdnjs.clou

我对angularJS非常陌生。我正在尝试为用户创建一个界面,用户可以从两个下拉列表中选择两个项目。它们实际上是相同的选项。当用户从左侧下拉列表中选择某个选项时,他将无法从右侧下拉列表中选择相同的选项,反之亦然。用户还将有一个按钮来添加更多选项。这段代码在任何情况下都可以正常工作,但是当用户单击按钮添加更多选项时,新添加的选项根本不起作用。 这是我的全部代码:

   <html>

<head>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.6.1/angular.js"></script>
</head>
<body>
<div ng-app="app">
    <div ng-controller="MyCtrl">
        <h2>Select one Item from left and one Item from right</h2>
        <select ng-model="leftmodel"
                ng-change="ChangeOptions()"
                ng-options="option as option.value disable
  when option.disabled for option in left">
        </select>

        <select ng-model="rightmodel"
                ng-change="ChangeOptions()"
                ng-options="option as option.value disable when option.disabled for option in right">

        </select>
        <button ng-click="addOptions()">Click Me</button>
    </div>
</div>
<script>
    var module = angular.module("app", []);
    module.controller("MyCtrl",
            function($scope) {
                $scope.left = [{
                    "name": "apple",
                    "value": "Nice Apple",
                    "disabled": false
                }, {
                    "name": "orange",
                    "value": "Yellow Orange",
                    "disabled": true
                }, {
                    "name": "berry",
                    "value": "Blue Berry",
                    "disabled": false
                }];

                $scope.right = [{
                    "name": "apple",
                    "value": "Nice Apple",
                    "disabled": true
                }, {
                    "name": "orange",
                    "value": "Yellow Orange",
                    "disabled": false
                }, {
                    "name": "berry",
                    "value": "Blue Berry",
                    "disabled": false
                }];

                $scope.leftmodel = $scope.left[0];
                $scope.rightmodel = $scope.right[1];
                $scope.addOptions=function()
                {
                    var banana={
                        "name": "banana",
                        "value": "Tasty Banana",
                        "disabled": false
                    };
                    var orange={
                        "name":"orange",
                        "value":"Soour Orange",
                        "disabled":false
                    };
                    $scope.left.push(banana);
                    $scope.left.push(orange);
                    $scope.right.push(banana);
                    $scope.right.push(orange);
                };
                $scope.ChangeOptions = function() {
                    var lsize = $scope.left.length;
                    var rsize = $scope.left.length;
                    for (var i = 0; i < lsize; i++) {

                        console.log($scope.left[i]);
                        if ($scope.left[i].name === $scope.rightmodel.name) {
                            $scope.left[i].disabled = true;
                        } else {
                            $scope.left[i].disabled = false;
                        }
                    }

                    for (var i = 0; i < rsize; i++) {
                        if ($scope.right[i].name === $scope.leftmodel.name) {
                            $scope.right[i].disabled = true;
                        } else {
                            $scope.right[i].disabled = false;
                        }
                    }
                };

            }
    );
</script>
</body>
</html>

从左侧选择一项,从右侧选择一项
点击我
变量模块=角度模块(“应用程序”,[]);
module.controller(“MyCtrl”,
职能($范围){
$scope.left=[{
“名称”:“苹果”,
“价值”:“漂亮的苹果”,
“禁用”:错误
}, {
“名称”:“橙色”,
“值”:“黄橙色”,
“残疾”:正确
}, {
“名称”:“浆果”,
“价值”:“蓝莓”,
“禁用”:错误
}];
$scope.right=[{
“名称”:“苹果”,
“价值”:“漂亮的苹果”,
“残疾”:正确
}, {
“名称”:“橙色”,
“值”:“黄橙色”,
“禁用”:错误
}, {
“名称”:“浆果”,
“价值”:“蓝莓”,
“禁用”:错误
}];
$scope.leftmodel=$scope.left[0];
$scope.rightmodel=$scope.right[1];
$scope.addOptions=function()
{
香蕉变种={
“名称”:“香蕉”,
“价值”:“美味香蕉”,
“禁用”:错误
};
变种橙={
“名称”:“橙色”,
“价值”:“苏尔橙”,
“禁用”:错误
};
$scope.left.push(香蕉);
$scope.left.push(橙色);
$scope.right.push(香蕉);
$scope.right.push(橙色);
};
$scope.ChangeOptions=函数(){
var lsize=$scope.left.length;
var rsize=$scope.left.length;
对于(变量i=0;i
我也有一个朋友。 单击按钮时,单击新创建的选项时出现的错误有:

TypeError:无法读取null的属性“name” 在ChildScope.$scope.ChangeOptions(first.html:89) fn时(编译时求值(angular.js:15156),:4:159) 在ChildScope.$eval(angular.js:17972) 在angular.js:25711 反对。(angular.js:28536) 在forEach(angular.js:357) 在对象处$$WriteModeScope(angular.js:28534) 在WriteToModelIfRequired(angular.js:28527) 在angular.js:28521 验证完成时(angular.js:28446)

谁能帮我,我怎么解决这个问题?提前谢谢


我注意到另一件奇怪的事。它可以在第88行处理名称。但是它在同一行失败,说它在第88行找不到
null
name
。下图显示了该场景。

您有两个
for
-循环,它们都使用变量
i
作为索引。Javascripts实际上将这些变量移动到作用域的顶部,因此解释器将创建如下内容:

$scope.ChangeOptions = function() {
    var lsize = $scope.left.length;
    var rsize = $scope.left.length;

    var i = 0;
    var i = 0;

    for(i; i < lsize; i++) {
        //
    }

    // After the previous loop, i will be 3
    for(i; i < rsize; i++) {
$scope.ChangeOptions=function(){
var lsize=$scope.left.length;
var rsize=$scope.left.length;
var i=0;
var i=0;
对于(i;i

这将导致第二个循环从i=3开始,因此它找不到
$scope.right[3].name
。要解决此问题,只需将第二个循环更改为另一个变量,如
j

,而不是在addOptions方法中初始化新变量。获取HTML中已定义的两个模型,并使用函数将其添加到数组中:

   $scope.addOptions=function()
            {
                var leftOption = $scope.leftmodel;
                var rightOption = $scope.rightmodel; 

                function newFruit(option){

                    var fruit = {
                    "name": option,
                    "value": "",
                    "disabled": false

                  };

                  return fruit;
                }

                $scope.left.push(newFruit(leftOption));
                $scope.right.push(newFruit(rightOption));
            };

您的代码中有两个缺陷

第一个是将同一对象推入
addOptions()
中的
left
right
数组。这意味着当您禁用右侧的对象时,左侧的对象将自动禁用(因为它们是相同的对象,而不仅仅是两个看起来相同的对象)。当它被禁用时,则
leftmodel
不再是有效选项,因此它将获得
undefined

通过使用
angular.copy()
克隆对象,在左侧和右侧创建两个不同的对象,可以更正此问题

您的第二个问题是,您的列表中已经有一个名为“
”橙色“
”的项目,因此如果您要从中选择一个
$scope.addOptions = function() {
  var banana = {
    "name": "banana",
    "value": "Tasty Banana",
    "disabled": false
  };
  var orange = {
    "name": "sorange",
    "value": "Soour Orange",
    "disabled": false
  };
  $scope.left.push(angular.copy(banana));
  $scope.left.push(angular.copy(orange));
  $scope.right.push(angular.copy(banana));
  $scope.right.push(angular.copy(orange));
};