Angularjs Ng在$http.get中设置变量作用域值后重复不更新
在我的AngularJS项目中,我有一个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'
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”
然后在DOMmyCtrl.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”
然后在DOMmyCtrl.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的答案