繁体   English   中英

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

[英]Pass $rootScope parameter to named function in factory

我正在开发一个非常模块化的应用程序。 在这个应用程序中,我有一家工厂,其工作是从另一个模块向控制器发送通知。 为此,我使用$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]);
})();

在这种情况下,问题是在sendNotification函数中未定义$rootScope对象,这很明显。 但是我不知道如何解决这个问题。

我一直在互联网上寻找解决方案,事实是,如果不添加一些代码,很难很难清楚地表达问题,因此是我的帖子。

感谢您的考虑:)

如果使用服务而不是工厂,则可以使用this转移注入的依赖项。 以这种方式使用服务,甚至更好,当你使用ES6类,让你稍微角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]);
})();

在您的notificationsFactory声明sendNotification -function-factory函数:

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;
            ....
        }
      };
    };

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM