2014-05-21 38 views
9

我正在从ng-view迁移到ui-view。AngularJS:ui-router用新内容重定向成功刷新范围

在我的控制器中,一旦成功创建/更新/删除,我想用新更新/创建/删除的数据重定向到索引视图。

我目前使用$state.go来做这个。

app.controller('AdminSupplierCreateController', ['$scope', '$state', 'Supplier', 
    function ($scope, $state, Supplier) { 
     $scope.h1 = "Register a new Supplier"; 

     $scope.store = function() 
     { 
      Supplier.post($scope.supplier) 
       .then(
        function() { 
         console.log("Successfully Created Supplier"); 
         $state.go('admin.supplier'); 
        }, 
        function(response) { 
         console.log("Error with status code: " + response.status); 
        } 
       ); 
     }; 
}]); 

问题是当$状态改变时,范围没有更新。看起来好像原始的admin.supplier范围数据没有被刷新。

在将范围设置为AdminSupplierIndexController之前,我已尝试使用$state.reload()更新ui-view

app.controller('AdminSupplierIndexController', ['$scope', '$state', 'suppliers', 
    function ($scope, $state, suppliers) { 
     $state.reload(); 
     $scope.suppliers = suppliers; 
}]); 

这样做可以使GET请求来api/v1/suppliers,但它实际上并没有显示更新的范围,除非我要么打在浏览器的刷新按钮或手动导航到不同的状态,然后再导航回。

$stateProvider 
    ... 
    .state('admin.supplier', { 
     url : "/supplier", 
     templateUrl : 'templates/admin/supplier/index.html', 
     controller: "AdminSupplierIndexController", 
     resolve: { 
      suppliers: ['Supplier', function(Supplier) { 
       return Supplier.getList(); 
      }] 
     } 
    }) 
    .state('admin.supplier.create', { 
     url : "/create", 
     templateUrl : 'templates/admin/supplier/create.html', 
     controller: "AdminSupplierCreateController" 
    }) 

解决方案:

app.controller('AdminSupplierCreateController', ['$scope', '$state', 'Supplier', 
    function ($scope, $state, Supplier) { 
     $scope.h1 = "Register a new Supplier"; 

     $scope.store = function() { 
      Supplier.post($scope.supplier) 
       .then(
        function() { 
         console.log("Successfully Created Supplier"); 

              // Force Reload on changing state 
              $state.go('admin.supplier', {}, {reload: true}); 
        }, 
        function(response) { 
         console.log("Error with status code: ", response.status); 
        } 
       ); 
     }; 
}]); 

回答

11

这是因为你移动到已创建父状态。你将不得不向ui-router发信号表明你想重新加载它。

我想你可能在寻找$state.go()reload选项。请参阅docs

此外,一种解决方法可能是将“索引”状态移动到编辑的同级状态。 admin.supplier.index左右。然后,在转换到admin.supplier.edit时,它将被销毁,并在您转换回来时重新创建,并且不需要其他选项。

另外作为一个旁注,我想这将被认为是良好的做法,尽可能使用$state.go而不是$location

+2

非常感谢。这已经解决了:'$ state.go('admin.supplier',{},{reload:true});'在'Supplier.post'的成功回调中' – Gravy

+0

这真的有所帮助,并且正如我期待的那样工作至。 – carbontwelve