Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/24.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 AngularJS-将数组值绑定到输入模型_Javascript_Angularjs - Fatal编程技术网

Javascript AngularJS-将数组值绑定到输入模型

Javascript AngularJS-将数组值绑定到输入模型,javascript,angularjs,Javascript,Angularjs,我有$scope.myArray,它通过ngModel和表达式{{myArray}与输入字段绑定 我的问题是,当我通过调用changeMyArray修改myArray时,输入的值没有改变。但是表达式{myArray}}是display new value 那么,为什么表达式工作,而输入字段不工作呢 我有办法,但我想找到更好的方法 var newArr = $scope.myArray; newArr.push("b"); $scope.myArray = angular.copy(newArr)

我有$scope.myArray,它通过ngModel和表达式{{myArray}与输入字段绑定

我的问题是,当我通过调用changeMyArray修改myArray时,输入的值没有改变。但是表达式{myArray}}是display new value

那么,为什么表达式工作,而输入字段不工作呢

我有办法,但我想找到更好的方法

var newArr = $scope.myArray;
newArr.push("b");
$scope.myArray = angular.copy(newArr);;

因此,您似乎想知道,为什么在推到数组时,$watch函数不执行增量。这是因为watch函数只检查对象引用的相等性

推送到数组时,引用保持不变。复制数组并在同一变量中再次设置它时,引用将更改


这就是@watchCollection按预期工作并在推送每个项目时递增的原因。

因此,您似乎想知道为什么在推送到数组时,$watch函数不执行递增操作。这是因为watch函数只检查对象引用的相等性

推送到数组时,引用保持不变。复制数组并在同一变量中再次设置它时,引用将更改


这就是@watchCollection按预期工作并在推送每个项时递增的原因。

基本上,我认为您要做的是将输入绑定到一个新的输入范围变量,然后在用户单击“推送”时将该变量的值推送到数组中。我的意思是:

在控制器中: 在HTML中: 这样,您可以通过ngModel更新字符串:

<input ng-model="myArrayString">
然后更新changeMyArray函数中的字符串:

$scope.changeMyArray = function() {
    $scope.myArray.push("b"); // Or whatever you would like to add here
    $scope.myArrayString = JSON.stringify($scope.myArray);
}
实验

发生什么事? 变量$scope.myArray是一个对象,Javascript中的任何对象都可以转换为字符串。大多数复杂对象最终都会变成无用的[object object]。数组在转换为字符串时将实际显示其内容,因此通过{{myArray}}将数组绑定到HTML非常简单


然而,反向转换并不是那么简单。通常,文本输入不能像我们希望的那样以双向方式绑定到数组。然后,解决方案是使用一个中间变量来保存字符串值,并使用$scope.$watch来保持两个值的同步。

基本上,我认为您要做的是将输入绑定到一个新的输入范围变量,然后在用户单击push to时将该变量的值推送到数组中。我的意思是:

在控制器中: 在HTML中: 这样,您可以通过ngModel更新字符串:

<input ng-model="myArrayString">
然后更新changeMyArray函数中的字符串:

$scope.changeMyArray = function() {
    $scope.myArray.push("b"); // Or whatever you would like to add here
    $scope.myArrayString = JSON.stringify($scope.myArray);
}
实验

发生什么事? 变量$scope.myArray是一个对象,Javascript中的任何对象都可以转换为字符串。大多数复杂对象最终都会变成无用的[object object]。数组在转换为字符串时将实际显示其内容,因此通过{{myArray}}将数组绑定到HTML非常简单


然而,反向转换并不是那么简单。通常,文本输入不能像我们希望的那样以双向方式绑定到数组。因此,解决方案是使用中间变量保存字符串值,并使用$scope.$watch保持两个值的同步。

我对我的问题有一个解释。如果我错了,请纠正我,非常感谢

我的问题: 为什么更改$scope.myArray时myArray输入字段不更新模型不更新视图

<input ng-model="myArray" id="myArray">
Sol2:创建custome$watch'email',函数{…},true。最后一个参数为TRUE,用于让Angular执行深度监视。然后,在watch的侦听器函数中,我手动设置$viewValue=newValue并调用ngModelController的$render来更新视图。如果我们有格式化程序,我们应该在此步骤中调用它们

    $scope.$watch('myArray', function(newValue, oldValue) {
if (newValue !== oldValue) {
        var ctrl = angular.element(document.querySelector('#myArray')).controller('ngModel');

        // Invoke formatter
        var formatters = ctrl.$formatters,
          idx = formatters.length;

        while(idx--) {
            newValue = formatters[idx](newValue);
        }

        ctrl.$render();
  }
    }, true);

我对我的问题有一个解释。如果我错了,请纠正我,非常感谢

我的问题: 为什么更改$scope.myArray时myArray输入字段不更新模型不更新视图

<input ng-model="myArray" id="myArray">
Sol2:创建custome$watch'email',函数{…},true。最后一个参数为TRUE,用于让Angular执行深度监视。然后,在watch的侦听器函数中,我手动设置$viewValue=newValue并调用ngModelController的$render来更新视图。如果我们有格式化程序,我们应该在此步骤中调用它们

    $scope.$watch('myArray', function(newValue, oldValue) {
if (newValue !== oldValue) {
        var ctrl = angular.element(document.querySelector('#myArray')).controller('ngModel');

        // Invoke formatter
        var formatters = ctrl.$formatters,
          idx = formatters.length;

        while(idx--) {
            newValue = formatters[idx](newValue);
        }

        ctrl.$render();
  }
    }, true);

我看不到您的小提琴中有任何输入,它正在成功地推动?您的示例小提琴没有输入。您是否可以更新示例以演示您的问题?您是否可以添加HTML代码,说明如何将myArray变量绑定到输入字段?如果您想使用输入文本字段将值推送到数组中,那么将其绑定到整个数组是行不通的,我更新了我的链接您在观看数组时使用了不同的变量名:countChange\u watch和countChange。我在您的小提琴中没有看到任何输入,它正在成功地推动?您的示例小提琴没有输入。你能更新这个例子来说明你的问题吗?你也能添加

如何将myArray变量绑定到输入字段?如果您想使用输入文本字段将值推送到数组中,那么将其绑定到整个数组是行不通的。抱歉,伙计们,我更新了我的链接。您可以使用不同的变量名:countChange\u watch和countChange来查看数组。谢谢@austin mullins,但我想用myArray绑定输入。我希望当我在myArray中推送新项目时,该更改应该在输入字段上更新。感谢您的澄清。我没有从这个问题上理解这一点。你能编辑这个问题来提供更多关于你想做什么的信息吗?谢谢@austin mullins,我编辑了我的问题。希望它能帮助你理解,我还没看到。我的第一个建议和第二个建议更接近了吗?就像我说的,它只是将数组转换为字符串,以显示内容。它相当于input.value=+myArray.Thank@austin mullins,但我想用myArray绑定输入。我希望当我在myArray中推送新项目时,该更改应该在输入字段上更新。感谢您的澄清。我没有从这个问题上理解这一点。你能编辑这个问题来提供更多关于你想做什么的信息吗?谢谢@austin mullins,我编辑了我的问题。希望它能帮助你理解,我还没看到。我的第一个建议和第二个建议更接近了吗?就像我说的,它只是将数组转换为字符串,以显示内容。它相当于input.value=+myArray。谢谢@sirrocco,我们还有其他方法来代替复制数组来更改引用吗?好的。。你需要更好地解释你想做什么。正如您从其他答案/commentsHi@sirrocco中看到的,这确实不清楚,您能帮我更正上面的答案吗?谢谢@sirrocco,我们有其他方法来代替复制数组以更改引用吗?好的。。你需要更好地解释你想做什么。你可以从其他答案/commentsHi@sirrocco中看到,这确实不清楚,你能帮我更正上面的答案吗?
    $scope.$watch('myArray', function(newValue, oldValue) {
if (newValue !== oldValue) {
        var ctrl = angular.element(document.querySelector('#myArray')).controller('ngModel');

        // Invoke formatter
        var formatters = ctrl.$formatters,
          idx = formatters.length;

        while(idx--) {
            newValue = formatters[idx](newValue);
        }

        ctrl.$render();
  }
    }, true);