我不知道这是不是一个好习惯...我在路由配置中定义了一个控制器,但由于我的HomeCtrl
在ng-if
语句中,他不能听loginSuccess
所以我制作MainCtrl
,听取loginSuccess
并做出适当的反应。这段代码工作正常,但这对我来说就像是一个黑客。我应该删除MainCtrl
并将其作为服务吗?如果是这样,一些例子真的很棒。
的index.html
<body ng-app="myApp" ng-controller="MainCtrl">
<div ng-if="!isLoged()">
<signIn></signIn>
</div>
<div ng-if="isLoged()">
<div class="header">
<div class="nav">
<ul>
<a href="/"><li class="book">navItem</li></a>
</ul>
</div>
</div>
<div class="container" ng-view=""></div>
</div>
</body>
App.js
angular.module('myApp', [])
.config(function ($routeProvider) {
$routeProvider
.when('/', {
templateUrl: 'views/main.html',
controller: 'HomeCtrl'
})
.otherwise({
redirectTo: '/'
});
})
.controller('MainCtrl', function ($scope) {
$scope.user = false;
$scope.isLoged = function(){
if($scope.user){
return true;
}else{
return false;
}
}
$scope.$on('event:loginSuccess', function(ev, user) {
$scope.user = user;
$scope.$apply();
});
})
.controller('HomeCtrl', function ($scope, $location) {
//this is home controller
})
.directive('signIn', function () {
return {
restrict: 'E',
link: function (scope, element, attrs) {
//go to the server and then call signinCallback();
}
};
})
.run(['$window','$rootScope','$log',function($window, $rootScope){
$window.signinCallback = function (res) {
if(res){
$rootScope.$broadcast('event:loginSuccess', res);
}
else{
$rootScope.$broadcast('loginFailure',res);
}
};
}]);
答案 0 :(得分:10)
我用以下内容启动所有Angular项目:
<html ng-app="appName" ng-controller="appNameCtrl">
使用“全局”控制器可能没有必要,但在需要时随身携带它总是很好的。例如,我在我的CMS中使用它来设置一个绑定,启动其他所有内容的加载 - 因此所有子控制器都被加载。这并不违反关注点的分离,因为全球控制器的关注点是促进其他控制器的加载。
尽管如此,只要确保将事物保持模块化/分离并尽可能重复使用。如果您的控制器依赖于全局控制器的存在以便运行,则存在问题。
答案 1 :(得分:0)
在我看来,角度js&#39;功能来自于清楚地分离出不同的控制器指令,服务,资源等。理想情况下,控制器链接到模板或部分,并用于更新前端并调用服务或资源。越早开始进行这些分离,您就越早开始制作干净且可扩展的应用程序,其他开发人员可以快速理解。对于应用程序结构,我强烈建议您查看这两个工具中的任何一个:
和
如果向下滚动,有线电视网站实际上对两者的差异有很好的总结。
在您的场景中,有许多方法可以链接控制器或进行不同范围的函数调用。您可以创建一个注入控制器的服务,也可以使用$ emit和$ on在应用程序中设置通知,例如:
在控制器A中
$rootScope.$on('myNotifier:call', function() {
myFunction();
});
在Controller B或任何其他控制器中,您可以使用:
调用myFunction()$scope.$emit('newPatientModal:close');