angularjs控制器执行两次

时间:2013-03-29 03:48:10

标签: angularjs

类似的问题被问到here,但它对我没有帮助。

我正在学习angularjs,我注意到控制器被执行了两次。

我有一个非常简单的小提示示例,显示行为here

我在学习服务的过程中构建了这个示例,起初我认为这是将服务注入控制器,但我评论了与服务相关的所有代码,并且控制器仍然执行了两次。

我的例子有效,但我担心我做错了什么。

<div ng-app="MyApp">
  <div ng-controller="MyCtrl">
    {{data1}} 
  </div>
</div>

var app = angular.module('MyApp', [])
app.service('Service1', function(){
  return {
    ajxResponse1: 'dataFromService1'
  };
 });

function MyCtrl($scope, Service1){
  alert('Entering MyCtrl');
  $scope.data1 = Service1.ajxResponse1;    
  alert('Exiting MyCtrl');
}

4 个答案:

答案 0 :(得分:25)

一个可能的来源是:如果您使用路由并在路由中指定控制器 - 您不能在路由使用的模板中指定它。当忽略这个问题时,我们遇到了这个问题。

答案 1 :(得分:4)

您的控制器在小提琴中运行了两次,因为角度被引用两次(一次通过框架和扩展下拉,另一次作为外部资源)。

请参阅此updated fiddle,其中我删除了外部资源,警报只显示一次。

代码保持不变:

function MyCtrl($scope, Service1, Service2, Service3){
    alert('Entering MyCtrl');
    $scope.data1 = Service1.ajxResponse1;
    $scope.data2 = Service2.ajxResponse2;
    $scope.data3 = Service3.ajxResponse3;
    alert('Exiting MyCtrl');
}

答案 2 :(得分:1)

我有类似的问题,这是由于我的路由中的斜线。

我的路线上有/ post {slug:[a-z0-9 - ] * /},当访问domain.com/post页面时,它会重定向到末尾有斜杠的版本。

花了我很多时间来解决它!

编辑: 实际上,只是更详细地看一下你的代码并注意到那里没有路由,所以这可能不是你的情况。

对于像我这样寻找不同解决方案的人来说,可能会有用。

答案 3 :(得分:0)

对于所有使用rails和angularjs的人:

将URLS映射到视图并使用angularjs $ route加载它们的rails框架,即使您有单视图应用程序也是如此。

为防止控制器重载: 转到application.js并删除“// = require turbolinks

欢迎你。