Angular的$location更改路径第二次有效,第一次无效。
Angular的$location更改路径第二次有效,第一次无效。
尽管这段代码看起来很简单,但是阅读了关于$location的文档后,我发现有很多我不理解的复杂性。我的设置如下:\n
// 在app.js中 $routeProvider.when('/done' , {templateUrl: 'partials/done.html', controller: 'DoneController'}); // 在我的控制器中,注入了$location,在按钮按下时... if (!$scope.errors.length) { $scope.model.save().then(function() { alert("我到这里了吗?"); $location.path('/done'); }); }
\n我按下按钮后看到了弹窗,但是视图没有发生变化。我再次按下按钮(第二次将数据保存到云端),我再次看到了弹窗,视图也发生了变化。有什么想法吗?谢谢提前。
Angular中的$location路径更改在第二次运行时有效,而第一次运行时无效的问题可能是由于异步操作引起的。当使用像jQuery这样的外部库时,这种情况通常发生。问题的关键在于,angular的$watch -> $digest -> $apply循环不会对外部库的事件进行触发。因此,更改已经完成,但并没有被angularjs传播出去。使用$scope.$apply()可以解决这个问题。
if (!$scope.errors.length) { $scope.model.save().then(function() { alert("did I get here?"); $scope.$apply(function(){ $location.path('/done'); }); }); }
我同意当异步事件在Angular框架之外生成时,使用$scope.$apply是解决问题的方法,我相信他的调用$scope.model.save()就是这种情况。但是$timeout是Angular框架的一部分,你不应该在$timeout回调中使用$scope.$apply。这就是$timeout的意义所在。
$scope.model.save().then(function() { $timeout(function () { $location.path('/done'); }); });
另一方面,你可以使用setTimeout()来说明这是最基本的异步调用,也是在框架之外的情况。
$scope.model.save().then(function() { setTimeout(function () { $location.path('/done'); }); });
谢谢,我的model.save()最终调用了parse.com,符合你关于在框架之外的理论。我以为我已经通过在github上找到的一个项目将parse的api封装在angular的promise中,但现在调查后,我发现那段代码没有运行。感谢你的建议(也谢谢)。
以上是关于Angular $location路径在第一次运行时无效的问题的原因和解决方法。通过使用$scope.$apply()和$timeout,可以确保在异步事件中正确触发Angular的$digest循环,从而使$location路径更改生效。