角度$scope值以相反的顺序设置
Angular $scope values set in reverse order
我已经在Angular上工作了一个月了。我一直在努力确定范围并保持视图之间的状态。
我不知道如何在角度中调试,所以我使用控制台在加载视图时跟踪范围的值。
这是我的控制器之一:
.controller('LegDetailCtrl',function($scope,$stateParams, LegService,ControllerService){
$scope.reservation = ControllerService.getReservation();
LegService.getLeg($stateParams.legId).then(function(data){
ControllerService.setLeg(data.data);
$scope.leg = data.data;
console.log('Check leg',angular.toJson($scope.leg));
});
$scope.seats = LegService.getSeats();
$scope.pax = LegService.getPax();
$scope.user = ControllerService.getUser();
$scope.reservation.leg = $scope.leg;
$scope.reservation.client = $scope.user;
$scope.reservation.pax = $scope.pax;
console.log('Check scope leg', angular.toJson($scope.leg));
})
据我了解,在JS中,执行是按从上到下的顺序进行的(不确定这一点)。我认为通过这种方式,我正在处理然后设置 $scope.leg 值,然后使用它来馈送 $scope.reservation 对象。
对我来说,正确的控制台输出是:
log Check leg, {aJsonObject}
log Check scope leg, {anotherJsonObject}
但我得到的是:
log Check scope leg,
log Check leg, {aJsonObject}
因此,看起来它将所有值都设置为范围,然后执行 LegService.getLeg() 方法。
如何使其以正确的顺序运行?
提前谢谢。
如果您使用的是chrome,则有一个很棒的AngularJS应用程序调试工具,称为Batarang。.
为了解决您的问题,您可以像下面这样链接您的承诺。
function LegDetailCtrl($stateParams, LegService, ControllerService){
var vm=this;
vm.reservation=ControllerService.getReservation();
LegService
.getLeg($stateParams.legId)
.then(function(data){
ControllerService.setLeg(data.data);
vm.leg=data.data;
return data.data;
})
.then(function(data) {
var user=ControllerService.getUser();
var pax=LegService.getPax();
var seats=LegService.getSeats();
vm.seats=seats
vm.pax=pax
vm.user=user
vm.reservation.leg=vm.leg;
vm.reservation.client=user
vm.reservation.pax=pax
});
}
LegDetailCtrl.$inject=['$stateParams', 'LegService', 'ControllerService'];
angular
.module('yourModule')
.controller('LegDetailCtrl', LegDetailCtrl)
下一行中的.then(
LegService.getLeg($stateParams.legId).then(function(data){
是对 then-block 内函数的异步调用(其中包含"Check leg")
执行被推迟到javascript的事件循环为空(javascript只是单线程的)。这意味着首先执行 main 函数的代码(结果是"检查作用域腿")之后,执行 then-block 内的异步调用("Check leg")
如果您在浏览器外部运行此代码,您会发现您传递给then
的回调中的console.log
调用根本不被调用。这是因为在解决 getLeg
返回的承诺之前不会调用回调,直到下一个角度$digest
周期才会发生这种情况。
相关文章:
- 如何设置箭头键以按顺序浏览
标记
- 获取项目的顺序 jQuery 可排序并设置它们的顺序
- 设置自定义覆盖和多边形的任意z索引顺序
- 设置附加到文本区域的字符串的顺序
- 如何在javascript中设置事件的顺序
- 如何根据GeoJSON属性中的ID号设置下拉列表项的顺序
- UI 网格设置列顺序
- 如何在多个文件中设置摩卡测试用例的执行顺序
- 在 JavaScript 中设置日期时间顺序
- 通用分析中用于设置自定义维度的操作顺序
- 按控制器设置默认顺序
- 角度$scope值以相反的顺序设置
- kineticJS按顺序加载图像(并设置fillPatternImg)不透明度补间不起作用
- moment.js:格式化日期以保持区域设置's的日期、月份和年份顺序
- 如何将回调顺序调用设置为与目标函数调用相同
- 如何将函数执行顺序设置为在JavaScript中使用回调函数
- JQuery按顺序设置列表项的动画,然后淡出列表并重复
- setTimeout在按顺序设置时不起作用
- 如何按照点击项目的顺序设置ng类
- 按列的垂直顺序设置tabindex