2013-08-30 42 views
0

在我的应用程序主模块的.run部分,我有一个$locationChangeStart事件的事件处理程序。我想用这个来确认丢弃未保存的更改。问题是我需要参考$scope才能执行这些检查。

我尝试添加该引用,因为我为$rootScope添加了该引用,但出现错误Uncaught Error: Unknown provider: $scopeProvider <- $scope

我应该如何继续?我愿意替代。

.run(['$rootScope', '$location', function ($rootScope, $location) { 
    $rootScope.$on("$locationChangeStart", function (event, next, current) { 
     if ($scope.unsavedChanges && !confirm('Unsaved changes') { 
      event.preventDefault(); 
     } 
    }); 
} 
+0

在任何其他控制器执行之前,运行块像主要方法一样运行。你怎么能注入你自己将来确定的依赖。注射发生在施工时,所以应该可以注入依赖性。 – Chandermani

+0

你是说我应该使用$ inject? –

+0

为什么不使用工厂/服务? – noj

回答

1

您只能将实例(不是提供者)注入run块。这是来自module的文档。

angular.module('myModule', []). 
    run(function(injectables) { // instance-injector 
     // This is an example of a run block. 
     // You can have as many of these as you want. 
     // You can only inject instances (not Providers) 
     // into the run blocks 
    }); 

所以你将无法注入$scopeProvider

+0

我最终在需要它的控制器上设置了'$ locationChangeStart'事件处理程序(直接在'$ scope'上)。这是一些代码重复,但我可以管理它。谢谢! –

0

你可以为你的函数注入$ scope,

.run(['$rootScope', '$location', '$scope', function ($rootScope, $location, $scope) 
+0

感谢您的帮助,但我已经尝试过。我在问题中说过。它给出了一个错误:'未捕获的错误:未知的提供者:$ scopeProvider < - $ scope“。 –

+0

为什么不在这里使用$ rootScope而不是$ scope? – BKM

+0

因为我不想污染具有特定于某些控制器的信息的'$ rootScope'。这只是个人喜好。 –

相关问题