Функция, вызываемая дважды внутри регулятора угла
Я новичок в 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 каждый раз, когда я показывал, это было скучно)