我是角度js的新手,目前仍然坚持使用非常有线的bug。控制器中的函数在路径加载的视图中运行两次。
你会看到警报两次!!
我的观点很简单
我的应用代码正在关注
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 :(得分: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调用,这很无聊)