Javascript AngularJS$location.path()未重新加载目标视图的数据

Javascript AngularJS$location.path()未重新加载目标视图的数据,javascript,angularjs,Javascript,Angularjs,在我的angular项目中,使用$location.path('/foobar')更改路径时,会显示目标视图,但不会重新加载数据(通常在保存项目并返回列表后,列表不会更新) 我试图添加$route.reload()或$scope.apply(),但没有任何更改 我不知道做这件事到底出了什么问题或遗漏了什么 更新 $location.url()也不起作用 我用的是角度1.2.26 更新2-回答 好的,在做了很多评论和回答之后,我想是时候结束了。 我没想到这会是一个如此复杂的问题 所以,我的结论

在我的angular项目中,使用
$location.path('/foobar')
更改路径时,会显示目标视图,但不会重新加载数据(通常在保存项目并返回列表后,列表不会更新)

我试图添加
$route.reload()
$scope.apply()
,但没有任何更改

我不知道做这件事到底出了什么问题或遗漏了什么

更新

  • $location.url()
    也不起作用
  • 我用的是角度1.2.26
更新2-回答

好的,在做了很多评论和回答之后,我想是时候结束了。
我没想到这会是一个如此复杂的问题

所以,我的结论是,你所说的是:

  • 给出@yvemancera的简单示例,控制器的默认行为是重新加载自身
  • 在具有资源工厂和一些REST调用的复杂控制器中,任何保存或更新操作都应手动更新列表引用,或触发列表的完全重新加载

大家都给了我一些好的建议,所以谢谢。

我昨天也遇到了同样的问题,如果您尝试导航到已在的同一路径,angular将不会尝试重新加载视图和控制器。对我来说,修复它的方法是在$routeProvider中的每条路线的末尾添加一个“/”,例如:

$routeProvider
  .when('/', {
    templateUrl: 'views/home.html',
    controller: 'HomeCtrl'
  })
  .when('/About/', {
    templateUrl: 'views/about.html',
    controller: 'AboutCtrl'
  })
  .when('/Contact/', {
    templateUrl: 'views/contact.html',
    controller: 'ContactCtrl'
  })
编辑

这是一个角度为1.2.26的工作弹头


试试
$scope.dataModel.$save()$url('/foobar')
解决此问题的另一个原因是:当您重定向到/foobar时,foobar的控制器应该对您的服务器进行AJAX调用以加载新数据。您应该使用angular factory进行AJAX调用
如果它仍然不工作,您能否提供有关您正在使用的angular的版本以及您的后端框架和数据库的更多信息。

您可以切换它的方法$state.reload(),它可以重新初始化整个控制器

若你们不想切换,那个么问题是控制器仍然有效,但你们可以在保存后实现

$rootScope.$broadcast('data:updated', $scope.data);
然后将在控制器中加载数据的方法包装到函数中,然后您可以将新数据推送到现有列表中/或使ajax重新加载

$rootScope.$on('data:updated',function(listener,data) {
 $scope.data.push(data);
});

$rootScope.$on('data:updated',function()
{
   callAjax.then(function(data) {
     $scope.data = data;
   }
});
$rootScope.Scope#$on

伪代码:-

    app.controller('myController', ['$scope', '$location','$http', 'ItemListService'
                    function($scope, $location, $http, ItemListService){
       $scope.data = function(){
       ItemListService.getAllItems(); //get all the items;
    };
        $scope.saveMethod = function(item){
       $scope.data = ItemListService.save(item); //this is the refresh part, return data through save method. Pull the latest data and bind it to the scope.
         $location.path('/fooView'); //dont think you even need this if you are entering data in a modal sorta thing, which on the same view. 
    }
    }]);
你的服务应该是这样的

app.service('ItemListService', function(){
    this.getAllItems = function(){
      //get the items from itemList
     //return all the items
   }

  this.save = function(item){
     //save the item in itemList
     //**return all items again, call getAllItems here too.
}
});

希望这有帮助

使用
$window.location.href.
重新加载页面。我只是看看:

页面重新加载导航

$location服务只允许您更改URL;它不允许您重新加载页面。当您需要更改URL并重新加载页面或导航到其他页面时,请使用较低级别的API,$window.location.href

例如:

$window.location.href = "/your/path/here";

对我有用

改用$location.url('/foobar')。请参阅否,$location.url()也有同样的问题,数据没有重新加载。我不确定是否理解您的问题。如果控制器是通过routeProvider链接到视图的,那么我想它应该被调用,否则视图就没有数据了,或者我遗漏了什么?ng模型应该可以为您处理很多这方面的问题。保存时应提交更改并更新模型。可能不需要重新加载页面。当控制器启动时,您的数据很可能被加载,而控制器只是维护旧数据,因为它从未超出范围。@RomanK。我就是这个意思!当我说刷新列表时,我不是想重新加载页面。您是对的,save方法应该更新模型。Sylver,我只能发布一些伪代码,因为我不知道您对数据模型的实现,但我已经尝试解释了我在回答中刷新列表获取的意思。我尝试了您的解决方案,但对我来说没有任何改变。可能是不同的angular版本,我会更新这篇文章。我更新了我的答案并添加了一个plunkr,我用angular 1.2.26获得了它,希望它有帮助。谢谢你的例子。在您的解决方案中,您提到在路由的末尾附加一个“/”来重新加载控制器,否则它不会重新加载。但是,如果我尝试在路径末尾使用“/”和不使用“/”的plunkr示例,它总是有效的。所以,给出这个简单的例子,我想这是默认行为,我的项目中有某种东西阻止了它的发生。听起来不错?就是这样!太棒了!$location.url/path在$save()内触发。我使用angular$resource和factory来定义我的模型对象。这个答案与我决定做的最接近,所以我接受它。但所有其他的主张都是正确的,这是一个问题。是$window.location.href仅当路径与当前路径不同时才会重新加载页面。在AngularJS中,通常不会更改路径,只会更改锚点(#)后面的部分。因此,如果保持在/#/some-route-1上,调用$window.location.href=“/#/some-route-2”将不会触发页面重新加载。
$location.path("/login");
$timeout(() => $scope.$apply(), 1000);