Javascript 角度$scope值按相反顺序设置
我已经在Angular上工作了一个月了。我一直在努力确定视图的范围并保持视图之间的状态 我不知道如何在angular中调试,所以在加载视图时,我使用控制台跟踪作用域的值 这是我的一个控制器:Javascript 角度$scope值按相反顺序设置,javascript,angularjs,Javascript,Angularjs,我已经在Angular上工作了一个月了。我一直在努力确定视图的范围并保持视图之间的状态 我不知道如何在angular中调试,所以在加载视图时,我使用控制台跟踪作用域的值 这是我的一个控制器: .controller('LegDetailCtrl',function($scope,$stateParams, LegService,ControllerService){ $scope.reservation = ControllerService.getReservation();
.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()方法
如何使其以正确的顺序运行
提前感谢。如果您在浏览器之外运行此代码,您会发现传递给
的回调中的控制台.log
调用根本不会被调用。这是因为只有在解析了由getLeg
返回的承诺之后才会调用回调,而在下一个$digest
周期之前不会调用回调。如果在浏览器之外运行此代码,您会发现传递给然后的回调中的console.log
调用根本没有被调用。这是因为只有在解析了由getLeg
返回的承诺之后才会调用回调,而在下一个$digest
周期之前不会调用回调。如果在浏览器之外运行此代码,您会发现传递给然后的回调中的console.log
调用根本没有被调用。这是因为只有在解析了由getLeg
返回的承诺之后才会调用回调,而在下一个$digest
周期之前不会调用回调。如果在浏览器之外运行此代码,您会发现传递给然后的回调中的console.log
调用根本没有被调用。这是因为只有在解析了getLeg
返回的承诺之后才会调用回调,而在下一个$digest
周期之前,回调不会发生
LegService.getLeg($stateParams.legId).then(function(data){
是对then块(包含“检查段”)内函数的异步调用
执行延迟到javascript的事件循环为空(javascript仅为单线程)。
这意味着首先执行主函数的代码(结果是“Check scope leg”)
然后执行then块内的异步调用(“检查段”)然后(
)在下面一行中
LegService.getLeg($stateParams.legId).then(function(data){
是对then块(包含“检查段”)内函数的异步调用
执行延迟到javascript的事件循环为空(javascript仅为单线程)。
这意味着首先执行主函数的代码(结果是“Check scope leg”)
然后执行then块内的异步调用(“检查段”)然后(
)在下面一行中
LegService.getLeg($stateParams.legId).then(function(data){
是对then块(包含“检查段”)内函数的异步调用
执行延迟到javascript的事件循环为空(javascript仅为单线程)。
这意味着首先执行主函数的代码(结果是“Check scope leg”)
然后执行then块内的异步调用(“检查段”)然后(
)在下面一行中
LegService.getLeg($stateParams.legId).then(function(data){
是对then块(包含“检查段”)内函数的异步调用
执行延迟到javascript的事件循环为空(javascript仅为单线程)。
这意味着首先执行主函数的代码(结果是“Check scope leg”)
然后执行then块内的异步调用(“Check leg”)如果您使用的是chrome,那么AngularJS应用程序有一个很棒的调试工具,名为
为了解决你的问题,你可以像下面这样把你的承诺串起来
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)
如果你使用chrome,有一个很棒的AngularJS应用程序调试工具,叫做
为了解决你的问题,你可以像下面这样把你的承诺串起来
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)
如果你使用chrome,有一个很棒的AngularJS应用程序调试工具,叫做
为了解决你的问题,你可以像下面这样把你的承诺串起来
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)
如果你使用chrome,有一个很棒的AngularJS应用程序调试工具,叫做
为了解决你的问题,你可以像下面这样把你的承诺串起来
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)
如果你需要控制aync内容的顺序,你可以链接你的承诺。看起来你有这个案例,但真的很难说。Fiddle?@marko就是这样。我尝试过cbass的解决方案,但它没有处理数据来设置leg值。如果你需要控制aync内容的顺序,你可以链接你的承诺。看起来你这里有这个案例,但很难说。Fiddle?@marko确实是这样。我尝试过cbass的解决方案,但它没有处理数据来设置leg值。如果你需要控制aync东西的顺序,你可以链接你的承诺。看起来你有这个案例,但很难说。Fiddle?@marko就是这样。我已经尝试过了cbass的解决方案,但它不是通过处理数据来设置leg值。如果你需要控制aync的顺序,你可以连锁你的承诺。看起来你有这个案例,但真的很难说。Fiddle?@marko就是这样。我试过cbass的解决方案,但它不是通过处理数据来设置leg值。谢谢。它很有效好的。唯一的问题是显然,ControllerService.setLeg(data.data)没有处理。它使用LegServiceREST api的原始数据设置$scope.leg是的,它在链接PromiseSgreeting之前正确地处理了数据。我了解到为了执行调用