AngularJS $位置不改变路径

mat*_*sko 124 angularjs

我在提交表单后更改页面的URL时遇到问题.

这是我的应用程序的流程:

  1. 路由已设置,URL被识别为某个表单页面.
  2. 页面加载,控制器设置变量,指令被触发.
  3. 触发了一个特殊的表单指令,它使用AJAX执行特殊的表单提交.
  4. 在执行AJAX之后(Angular不处理AJAX)然后触发回调并且指令调用$scope.onAfterSubmit设置位置的函数.

问题是在设置位置后没有任何反应.我也试过设置位置参数/......不.我也试过不提交表格.什么都行不通.

我已经测试过以查看代码是否达到了onAfterSubmit函数(它的功能).

我唯一想到的是,函数的范围以某种方式被改变(因为它从一个指令中被调用),但是onAfterSubmit如果范围发生变化,它又如何调用呢?

这是我的代码

var Ctrl = function($scope, $location, $http) {
  $http.get('/resources/' + $params.id + '/edit.json').success(function(data) {
    $scope.resource = data;
  });

  $scope.onAfterSubmit = function() {
    $location.path('/').replace();
  };
}
Ctrl.$inject = ['$scope','$location','$http'];
Run Code Online (Sandbox Code Playgroud)

有人可以帮帮我吗?

F L*_*has 291

几天前我遇到了类似的问题.在我的情况下,问题是我用第三方库(确切地说是jQuery)改变了东西,在这种情况下即使调用函数和设置变量工作,Angular也不总是认识到有变化因此它永远不会消化.

$ apply()用于从角度框架外部以角度执行表达式.(例如,来自浏览器DOM事件,setTimeout,XHR或第三方库).

尝试$scope.$apply()在更改位置后立即使用,并调用replace()让Angular知道事情已经发生了变化.

  • 就像JasonS所说的那样,使用$ timeout(function(){// apply changes here}); 这有两个好处:1)您不需要访问$ scope.2)你不必担心$ apply alredy running.对于第二个原因,使用$ timeout通常是首选方法. (7认同)
  • 为了更好地了解$ apply如何使用角度以及如何解决它的问题,这里有一个链接http://www.yearofmoo.com/2012/10/more-angularjs-magic-to-supercharge-your -webapp.html#适用消化和相 (4认同)
  • 可以用$ timeout包装你的回调,并且范围将被正确应用 (4认同)
  • @Skeater你可以简单地注入根范围并对其进行操作,如下所示:factory('xyz',['$ rootScope',function($ rootScope){...}]) (2认同)

Pau*_*ira 55

而不是$ location.path(...)更改或刷新我使用该服务的页面$window,在Angular中,此服务用作window对象的接口,该window对象包含一个属性location,使您可以处理与该位置相关的操作或URL的东西.

例如,window.location您可以分配新页面,如下所示:

$window.location.assign('/');
Run Code Online (Sandbox Code Playgroud)

或刷新它,像这样:

$window.location.reload();
Run Code Online (Sandbox Code Playgroud)

它对我有用.它与您期望的有点不同,但适用于给定的目标.

  • 唯一适用于我的方法.$ location很糟糕. (8认同)
  • 我也是,当url有params时,$ location.path()不会重定向 (3认同)
  • 这是正确的答案.见[这里](http://stackoverflow.com/a/33449178/839639) (2认同)

Ros*_*s R 28

我遇到了同样的问题,但是我在$摘要中对$ location的调用已经很好了.调用$ apply()只是在进程错误中给出了$ digest.

这个技巧有效(并且一定要注入$location你的控制器):

$timeout(function(){ 
   $location...
},1);
Run Code Online (Sandbox Code Playgroud)

虽然不知道为什么这是必要的......

  • $$ phase是一个私有变量,您不应该尝试访问它,因为它可能会在新的angularjs版本中更改. (6认同)
  • 使用$ timeout可能是一个黑客,但使用$$阶段是一个更大的黑客.通常,不要查看或触摸前缀为$$的任何内容. (6认同)
  • 不,这是一个坏主意.只需检查阶段是否在摘要中,然后您可以跳过申请.Angular将赶上它并自行更改URL:https://coderwall.com/p/ngisma (4认同)
  • 经过大约10个小时的随机破坏......这个解决方案对我有用! (3认同)
  • 超时对我来说似乎是一个肮脏的黑客.如果您的href包含"#",则$ location.path()不会按预期工作.只需在你的标签上删除完全href ="#"或只设置为href =""你就不需要使用$ timeout (2认同)

Hel*_*ate 6

我不得不$location.path()像这样嵌入我的声明,因为我的摘要仍在运行:

       function routeMe(data) {                
            var waitForRender = function () {
                if ($http.pendingRequests.length > 0) {
                    $timeout(waitForRender);
                } else {
                    $location.path(data);
                }
            };
            $timeout(waitForRender);
        }
Run Code Online (Sandbox Code Playgroud)