在angularjs控制器内调用两次函数

时间:2013-10-26 16:22:51

标签: angularjs angularjs-scope

我是角度js的新手,目前仍然坚持使用非常有线的bug。控制器中的函数在路径加载的视图中运行两次。

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

你会看到警报两次!!

我的观点很简单               

我的应用代码正在关注

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' });

});

4 个答案:

答案 0 :(得分:46)

首先检查您是否未初始化Angular应用两次(通过 ng-app 自动初始化)。

  

有一次,我有两个带有ng-app的html页面(一个用于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两次消化我的控制器。

要解决这个问题,您有两种方法:

从您的html文件中删除 ng-controller ,如下所示:

<section class="content">

或从路由中删除控制器(通常位于app.js中):

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

答案 1 :(得分:3)

我认为通过创建插值{{greet()}},您可以在函数greet上创建一个监视。这个函数可以像摘要周期一样多次调用,所以它不是运行1或2次的问题。所以你不应该依赖于调用函数的时间。

答案 2 :(得分:0)

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

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

答案 3 :(得分:-2)

我遇到了同样的问题,所以我做了:

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

就像它是单身人士一样! (每次我显示时都有很多ajax调用,这很无聊)