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

时间:2015-06-25 17:25:09

标签: javascript angularjs

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

我尝试添加$route.reload()$scope.apply(),但没有任何变化。

我不知道做错了什么或错过了什么。

更新

  • $location.url()没有'工作
  • 我使用角1.2.26

更新2 - 答案

好的,经过大量的评论和回答后,我认为现在是时候结束这个了 我认为这不是一个如此复杂的问题。

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

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

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

6 个答案:

答案 0 :(得分:8)

使用 <ion-list ng-controller="CamerasCtrl"> <button class="button-block icon ion-search" ng-click="searchForCameras()"> Find Cameras </button> <ion-item ng-repeat="camera in cameras"> <label class="item item-input"> <i class="icon ion-camera placeholder-icon"></i>{{camera.name}} - <input type="text" class="block" ng-model="camera.ip" ng-change="onCameraIPChange(camera)" placeholder="{{camera.ip}}"> <i id="connected" ng-class="camera.class"></i> </label> <div class="col text-right"> <button ng-show="camera.connected && camera.files" class="button icon ion-android-delete" ng-click="formatCamera(camera)"> Format camera </button> </div> </ion-item> </ion-list> 重新加载页面。我只是查看$location document

  

网页重新加载导航

     

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

示例:

$window.location.href.

答案 1 :(得分:3)

我昨天遇到了同样的问题,如果你试图导航到你已经进入的相同路径,则角度不会尝试重新加载视图和控制器。为我修好的是追加&#34; /&#34;在$ 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

的工作插件

http://plnkr.co/edit/jkGKKCp0djN6Jvy2fIRd?p=preview

答案 2 :(得分:2)

伪代码: -

extension Dictionary : CollectionAccess {
    func getElement<T : Hashable>(key: T) -> Dictionary.Generator.Element?     {
        if key.self is Key.Type {
            let tKey = key as! Key
            if let value = self[tKey] {
                return (tKey, value)
            }
         }
        return nil
    }
}

您的服务应该是,

    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. 
    }
    }]);

希望这会有所帮助!!

答案 3 :(得分:1)

你可以切换https://github.com/angular-ui/ui-router方法$ 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;
   }
});

https://docs.angularjs.org/api/ng/type/ $ rootScope.Scope#$上

答案 4 :(得分:0)

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

答案 5 :(得分:0)

$location.path("/login");
$timeout(() => $scope.$apply(), 1000);

适合我