将$ rootScope参数传递给工厂中的命名函数

时间:2015-08-20 10:17:08

标签: javascript angularjs

我正在开发一个非常模块化的应用程序。在这个应用程序中,我有一个工厂,其工作是从另一个模块向控制器发送通知。为此,我使用$rootScope对象来触发名为newNotification的事件并传递数据。

使用以下代码一切正常:

notifications.factory.js

(function() {
    'use strict';

    function notificationsFactory($rootScope) {
        return {
            sendNotification: function(data) {
                switch(data.type) {
                    case 'actors':
                        $rootScope.$broadcast('newNotification', data);
                        break;
                    .....
                }
            } 
        }
    };

    angular.module('features.notifications.factory', [])
    .factory('notificationsFactory', ['$rootScope', notificationsFactory]);
})();

那么,问题是什么?嗯,问题是,为了获得更干净的工厂,因为将添加更多功能,目的是返回具有命名功能的对象。

为了更清楚一点,我的目标是看起来像这样:

notifications.factory.js

(function() {
    'use strict';

    function notificationsFactory($rootScope) {
        return {
            sendNotification: sendNotification
        }
    };

    function sendNotification(data) {
        switch(data.type) {
            case 'actors':
                $rootScope.$broadcast('newNotification', data);
                break;
            ....
        }
    };

    angular.module('features.notifications.factory', [])
    .factory('notificationsFactory', ['$rootScope', notificationsFactory]);
})();

在这种情况下,问题是$rootScope函数中没有定义sendNotification对象,这很明显。但我无法弄清楚如何解决这个问题。

我在互联网上寻找解决方案,事情是,如果没有放一些代码就很难明确表达问题,因此我的帖子。

感谢您的考虑:)

2 个答案:

答案 0 :(得分:3)

如果您使用服务而不是工厂,则可以使用this传输注入的依赖项。当您使用ES6类时,以这种方式使用服务会更好,并使您略微更多Angular 2.0准备就绪。

(function() {
    'use strict';

    function NotificationsService($rootScope) {
        this.$rootScope = $rootScope;
    };

    NotificationsService.prototype.sendNotification = function sendNotification(data) {
        switch(data.type) {
            case 'actors':
                this.$rootScope.$broadcast('newNotification', data);
                break;
            ....
        }
    };

    angular.module('features.notifications.service', [])
    .service('NotificationsService', ['$rootScope', NotificationsService]);
})();

ES6版本:

(function() {
    'use strict';

    class NotificationsService {
        constructor($rootScope) {
            this.$rootScope = $rootScope;
        }

        sendNotification(data) {
            switch(data.type) {
                case 'actors':
                    this.$rootScope.$broadcast('newNotification', data);
                    break;
                ....
            }
        }
    }

    angular.module('features.notifications.service', [])
    .service('NotificationsService', ['$rootScope', NotificationsService]);
})();

答案 1 :(得分:1)

sendNotification - 工厂函数中声明notificationsFactory - 函数:

function notificationsFactory($rootScope) {
    function sendNotification(data) {
        switch(data.type) {
            case 'actors':
                $rootScope.$broadcast('newNotification', data);
                break;
            ....
        }
      };
      return {
          sendNotification: sendNotification
      }
    };

或使用服务代替工厂,你可以这样写:

function notificationsFactory($rootScope) {
    this.sendNotification = function(data) {
        switch(data.type) {
            case 'actors':
                $rootScope.$broadcast('newNotification', data);
                break;
            ....
        }
      };
    };