2013-10-26 48 views
14

我是新来的角js,目前卡住了非常有线的一种错误。当一个控制器通过视图加载路由时调用两次函数。在angularjs控制器中调用两次函数

http://jsfiddle.net/4gwG3/5/

你会看到警报两次!

我的看法很简单

和我的应用程序代码是通过创建一个插值{{greet()}}以下

var IB = angular.module('IB', []);  

//channel controller 
IB.controller('channelsController', function ($scope, $routeParams) { 
    $scope.greet = function() { 
     alert('hi'); 
    }; 
}); 


IB.config(function ($routeProvider) { 
    $routeProvider 
    .when('/channels', { 
     controller: 'channelsController', 
     template: '{{greet()}}' 
    }) 

    .otherwise({ redirectTo: '/channels' }); 

}); 
+0

需要读取摘要循环......他们可以被调用多次。这将有助于解释你想达到什么目的 – charlietfl

回答

37

首先检查你是不是初始化你的Angular应用两次(通过使用ng-app自动初始化它)。

有一次我用ng-app(一个用于login.html,另一个用于main.html),这是我后来意识到的一个问题。

其次对我来说最重要的是,检查您是否将控制器连接到多个元素。如果您使用路由,这是一种常见情况。

在我来说,我是导航到DashboardController像这样:

app.config(function($routeProvider){ 
    $routeProvider 
    .when('/', { 
     controller: 'DashboardController', 
     templateUrl: 'pages/dashboard.html' 
    }) 
}); 

但我也有过这样的dashboard.html:

<section class="content" ng-controller="DashboardController"> 

哪个正在指导AngularJS两次消化我的控制器。

为了解决这个问题,有两种方式:

去除NG控制器从你的HTML文件中像这样:

<section class="content"> 

或从路由移除控制器(即通常位于应用程序.js):

app.config(function($routeProvider){ 
$routeProvider 
     .when('/', { 
      templateUrl: 'pages/dashboard.html' 
     }) 
    }); 
3

我想,你在功能greet创建监视。这个函数可以在摘要循环运行的时候调用多次,所以它不是一个运行1或2次的问题。所以你不应该依赖函数被调用的时间。

+1

所以你可以让我知道一个视图怎样在其控制器内调用一个函数。何时可以控制器调用一次功能一旦视图加载? – najam

+0

您已经在视图内调用控制器的功能,并且完成此操作非常好。我所说的唯一的事情就是你不能依靠这个函数被调用的次数。我不明白你的第二部分。我强烈建议你看开发指南http://docs.angularjs.org/guide/concepts – Chandermani

+0

我想查看请求在控制器中定义的函数一次?第二种方式是控制器知道视图已加载,因此他可以调用一些功能,这些功能会导致昂贵的调用,如使用实时流加载Web播放器。 – najam

0

我不知道你想在这里实现什么。有两个警报 1.当controller被调用。 2.当template得到评估。

template是提供视图部分,但是,在这种情况下,模板只是评估函数,它不会创建任何视图。

-3

我有同样的问题,所以我所做的:

$scope.init=function() 
{ 
    if ($rootScope.shopInit==true) return; 
    $rootScope.shopInit=true; 
    ... 
} 
$scope.init(); 

一样,如果它是一个单! (我每次显示都有很多阿贾克斯调用,这很无聊)