[AngularJS] Using Services in Angular Directives

Directives have dependencies too, and you can use dependency injection to provide services for your directives to use.

 

Bad: If you want to use <alert> in another controller or page, you have to modify the AlertService. This might break things.

复制代码
<!DOCTYPE html>
<html>
<head>
    <title>Egghead.io Tutorials</title>
    <link rel="shortcut icon" href="favicon.ico">
    <link href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.1/css/bootstrap.min.css" rel="stylesheet">
    <script src="//cdnjs.cloudflare.com/ajax/libs/angular.js/1.3.3/angular.js"></script>
    <script src="//cdnjs.cloudflare.com/ajax/libs/angular-ui-router/0.2.11/angular-ui-router.js"></script>
    <script src="//cdnjs.cloudflare.com/ajax/libs/angular-ui-bootstrap/0.12.0/ui-bootstrap.js"></script>
    <script src="//cdnjs.cloudflare.com/ajax/libs/angular-ui-bootstrap/0.12.0/ui-bootstrap-tpls.js"></script>
    <script src="app.js"></script>
</head>
<body ng-app="app" ng-controller="MainCtrl as main">

    <alert type="{{main.AlertService.alertType}}" ng-if="main.AlertService.isShowAlert">{{main.AlertService.alertMessage}}</alert>
    <button ng-click="main.showAlert();">Something Failed</button>
</body>
</html>
复制代码
复制代码
angular.module("app", ["ui.bootstrap"])
    .controller('MainCtrl', function MainCtrl(AlertService) {
        var mainCtrl = this;
        mainCtrl.AlertService = AlertService;
    })

    .service('AlertService', function AlertService() {
        var AlertService = {};
        AlertService.false = true;
        AlertService.showAlert = function() {
            AlertService.alertType="success";
            AlertService.alertMessage = "There is a message";
            AlertService.isShowAlert = true;
        }
        return AlertService;
    });
复制代码

 

Good: Using Directive injected by the service. Then the <alert> is no longer bind with the controller anymore.

复制代码
<!DOCTYPE html>
<html>
<head>
    <title>Egghead.io Tutorials</title>
    <link rel="shortcut icon" href="favicon.ico">
    <link href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.1/css/bootstrap.min.css" rel="stylesheet">
    <script src="//cdnjs.cloudflare.com/ajax/libs/angular.js/1.3.3/angular.js"></script>
    <script src="//cdnjs.cloudflare.com/ajax/libs/angular-ui-router/0.2.11/angular-ui-router.js"></script>
    <script src="//cdnjs.cloudflare.com/ajax/libs/angular-ui-bootstrap/0.12.0/ui-bootstrap.js"></script>
    <script src="//cdnjs.cloudflare.com/ajax/libs/angular-ui-bootstrap/0.12.0/ui-bootstrap-tpls.js"></script>
    <script src="app.js"></script>
</head>
<body ng-app="app" ng-controller="MainCtrl as main">

    <alert-message></alert-message>
    <!--<alert type="{{main.AlertService.alertType}}" ng-if="main.AlertService.isShowAlert">{{main.AlertService.alertMessage}}</alert>-->
    <button ng-click="main.showAlert();">Something Failed</button>
</body>
</html>
复制代码
复制代码
angular.module("app", ["ui.bootstrap"])
    .service('AlertService', function AlertService() {
        var AlertService = {};
        AlertService.false = true;
        AlertService.showAlert = function() {
            AlertService.alertType="success";
            AlertService.alertMessage = "There is a message";
            AlertService.isShowAlert = true;
        }
        return AlertService;
    })


    .directive('alertMessage', function() {
        return {
            bindToController: true,
            controller: 'AlertCtrl',
            controllerAs: 'alertCtrl',
            template: '<alert type="{{alertCtrl.AlertService.alertType}}" ng-if="alertCtrl.AlertService.isShowAlert">{{alertCtrl.AlertService.alertMessage}}</alert>'
        }
    })

    .controller('AlertCtrl', function(AlertService) {
        var alertCtrl = this;

        alertCtrl.AlertService = AlertService;
    })

    
    .controller('MainCtrl', function(AlertService) {
        var main = this;
        main.AlertService = AlertService;
        main.showAlert = function() {
            main.AlertService.isShowAlert = true;
            main.AlertService.alertType="danger";
            main.AlertService.alertMessage = "Something wrong happened";
        }
    });
复制代码

 

anuglar-ui-bootstrap: 

http://angular-ui.github.io/bootstrap/

 bindToController:

http://flipjs.io/2014/09/09/isolate-scope-controller-as/

posted @   Zhentiw  阅读(377)  评论(0编辑  收藏  举报
(评论功能已被禁用)
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示