Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.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
Angularjs Ng在$http.get中设置变量作用域值后重复不更新_Angularjs_Angularjs Scope_Angularjs Ng Repeat - Fatal编程技术网

Angularjs Ng在$http.get中设置变量作用域值后重复不更新

Angularjs Ng在$http.get中设置变量作用域值后重复不更新,angularjs,angularjs-scope,angularjs-ng-repeat,Angularjs,Angularjs Scope,Angularjs Ng Repeat,在我的AngularJS项目中,我有一个selectHTML元素,它应该与巴西各州绑定。因此,我使用一个ng repeat来填充状态,这些状态是使用restfulapi从我的项目数据库加载的。 然后,在我的控制器中,我在作用域上创建了一个名为estados的变量,并为它设置了一个空数组[1]。在调用$http.get[2]之后,我从数据库接收数据,并将其设置为$scope.estados[3],这在ng repeat中使用。[4] 控制器代码: myApp.controller('myCtrl'

在我的AngularJS项目中,我有一个
select
HTML元素,它应该与巴西各州绑定。因此,我使用一个ng repeat来填充状态,这些状态是使用restfulapi从我的项目数据库加载的。 然后,在我的控制器中,我在作用域上创建了一个名为
estados
的变量,并为它设置了一个空数组[1]。在调用$http.get[2]之后,我从数据库接收数据,并将其设置为$scope.estados[3],这在ng repeat中使用。[4]

控制器代码:

myApp.controller('myCtrl', function($scope, $http, API_URL) {
    $scope.estados = []; //[1]
    $http({ // [2]
        method: 'GET',
        url:API_URL + '/estados',
        headers: {'Content-Type': 'application/x-www-form-urlencoded'}
    }).then(function(response) {
        if(response.status == 200){
            $scope.estados = response.data; // [3]
            console.log($scope.estados);
        }
    }); 
});
HTML代码:

<select name="uf" class="form-control" ng-model="Empresa.endereco.estado_uf">
   <option ng-repeat="estado in estados" ng-value="estado.uf"> {{estado.nome}}</option> <!-- [4] -->
</select>
但它从未用数据库值更新过。
我做错了什么?我似乎与引用有关,但我不知道具体是什么。

我还无法测试,但如果替换引用,则通常
ngRepeat
会失去跟踪数组的功能。你的控制器中发生了什么

您可以做的一个快速测试是编辑控制器以保持对同一数组的引用,并通过循环并将新结果添加到已绑定的数组来操作它

myApp.controller('myCtrl', function($scope, $http, API_URL) {
    $scope.estados = []; //[1]
    $http({ // [2]
        method: 'GET',
        url:API_URL + '/estados',
        headers: {'Content-Type': 'application/x-www-form-urlencoded'}
    }).then(function(response) {
        if(response.status == 200){
            $scope.estados.length = 0; // truncate array
            for(var state in response.data)
               $scope.estados.push(state); // [3]

            console.log($scope.estados);
        }
    }); 
});

我还不能测试,但如果替换引用,则通常
ngRepeat
会失去跟踪阵列的功能。你的控制器中发生了什么

您可以做的一个快速测试是编辑控制器以保持对同一数组的引用,并通过循环并将新结果添加到已绑定的数组来操作它

myApp.controller('myCtrl', function($scope, $http, API_URL) {
    $scope.estados = []; //[1]
    $http({ // [2]
        method: 'GET',
        url:API_URL + '/estados',
        headers: {'Content-Type': 'application/x-www-form-urlencoded'}
    }).then(function(response) {
        if(response.status == 200){
            $scope.estados.length = 0; // truncate array
            for(var state in response.data)
               $scope.estados.push(state); // [3]

            console.log($scope.estados);
        }
    }); 
});

您可以尝试两种更改:

1) Explicit set track by通常可以帮助ng repeat刷新元素(即使默认情况下它已经是
track by$index
):

2) 与其将数组分配给新数组,不如将结果分配给当前空数组:

$scope.estados.concat(response.data);

您可以尝试两种更改:

1) Explicit set track by通常可以帮助ng repeat刷新元素(即使默认情况下它已经是
track by$index
):

2) 与其将数组分配给新数组,不如将结果分配给当前空数组:

$scope.estados.concat(response.data);

我有两个建议

首先-不要将数据分配给
$scope
变量(在“点规则”上快速搜索某些上下文)。而是在控制器代码中使用
this.estados=data
将其分配给控制器变量,然后在DOM中使用ControllerAs变量访问它。。。e、 g:

ng controller=“myCtrl as myCtrl”
然后在DOM
myCtrl.estados
中,而不是
$scope.estados

注意:
$http
回调函数中,
将不再引用控制器。您需要在控制器代码主体中存储对该的引用,以便以后可以引用它。我倾向于使用
var controller=this
位于所有控制器代码的顶部,因此在任何返回函数中都可以轻松访问

。。。为您的选择使用ng选项,而不是中继器。它更加健壮,并确保正确的数据绑定。所以在你的例子中:

上面的
用于引用
选择
元素中所需的任何其他内容,如
ng模型


我怀疑,仅仅转换为点表示法而不是使用
$scope
就可以解决这种情况。。。像
ngif
ngswitch
(任何将元素从DOM中拉出的指令)这样的指令可能会使
$scope
变量无法访问,这在某种程度上是不可预测的。在我看来,使用
ng选项始终是一种更好的做法。

我有两条建议

首先-不要将数据分配给
$scope
变量(在“点规则”上快速搜索某些上下文)。而是在控制器代码中使用
this.estados=data
将其分配给控制器变量,然后在DOM中使用ControllerAs变量访问它。。。e、 g:

ng controller=“myCtrl as myCtrl”
然后在DOM
myCtrl.estados
中,而不是
$scope.estados

注意:
$http
回调函数中,
将不再引用控制器。您需要在控制器代码主体中存储对该
的引用,以便以后可以引用它。我倾向于使用
var controller=this
位于所有控制器代码的顶部,因此在任何返回函数中都可以轻松访问

。。。为您的选择使用ng选项,而不是中继器。它更加健壮,并确保正确的数据绑定。所以在你的例子中:

上面的
用于引用
选择
元素中所需的任何其他内容,如
ng模型


我怀疑,仅仅转换为点表示法而不是使用
$scope
就可以解决这种情况。。。像
ngif
ngswitch
(任何将元素从DOM中拉出的指令)这样的指令可能会使
$scope
变量无法访问,这在某种程度上是不可预测的。在我看来,使用
ng选项始终是一种更好的做法。

这已在许多链接中讨论过

实际上,我们应该只使用范围中的对象。原始值不会反映在消化循环中

建议在作用域中使用对象

$scope.object= {};
$scope.object.estados = [];
$scope.object.estados = response.data; 
HTML:


{{estado.nome}}
请阅读下面的链接


这已在许多链接中讨论过

实际上,我们应该只使用范围中的对象。原始值不会反映在消化循环中

建议在作用域中使用对象

$scope.object= {};
$scope.object.estados = [];
$scope.object.estados = response.data; 
HTML:


{{estado.nome}}
请阅读下面的链接


多丽瓦尔给s的答案