Функция, вызываемая дважды внутри регулятора угла

Я новичок в angular js и в настоящее время застрял с очень проводным видом ошибки. функция в контроллерах выполняется дважды, когда ее вызываемый по представлению загружается по маршруту.

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

});

Ответы

Ответ 1

Сначала убедитесь, что вы дважды не инициализировали приложение Angular (автоматически инициализировав его ng-app).

Однажды у меня было 2 html-страницы с 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-controller из вашего html файла следующим образом:

<section class="content">

или удаление контроллера из маршрутизации (обычно это находится в app.js):

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

Ответ 2

Я думаю, создав интерполяцию {{greet()}}, вы создаете часы на функции greet. Эта функция может получить вызов столько раз, сколько цикл цикла дайджест, так что это не вопрос о том, что он работает 1 или 2 раза. Поэтому вы не должны зависеть от времени, когда функция вызывается.

Ответ 3

Я не знаю, чего вы пытаетесь достичь здесь. Есть два предупреждения 1. Когда вызывается controller. 2. Когда оценивается template.

template заключается в том, чтобы предоставить часть представления, однако в этом случае шаблон просто оценивает функцию, которая не создает никакого представления.

Ответ 4

У меня была такая же проблема, поэтому я сделал:

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

Как если бы это был синглтон! (У меня было много вызовов ajax каждый раз, когда я показывал, это было скучно)