Angularjs Angular+Firebase+AngularFire种子指令ShowAdmin

Angularjs Angular+Firebase+AngularFire种子指令ShowAdmin,angularjs,angularjs-directive,firebase,angularfire,Angularjs,Angularjs Directive,Firebase,Angularfire,首先,对我的情况进行冗长的描述。。。我的应用程序使用Angular.js和AngularFire在没有后端的情况下运行。我使用Firebase Simple Login进行身份验证,AngularFire种子项目提供了获取身份验证信息的简单方法。要在应用程序中创建管理员,我将用户的uid存储在Firebase的/admin中,以便检查/admin/simpleLogin:45是否存在,例如,查看uid simpleLogin:45的用户是否是管理员 我正在尝试创建一个指令,如果当前用户是我的应用

首先,对我的情况进行冗长的描述。。。我的应用程序使用Angular.js和AngularFire在没有后端的情况下运行。我使用Firebase Simple Login进行身份验证,AngularFire种子项目提供了获取身份验证信息的简单方法。要在应用程序中创建管理员,我将用户的uid存储在Firebase的/admin中,以便检查/admin/simpleLogin:45是否存在,例如,查看uid simpleLogin:45的用户是否是管理员

我正在尝试创建一个指令,如果当前用户是我的应用程序的管理员,该指令将导致显示一个元素。我已经写了一个部分有效的指令,但我很难解决这些问题。我请求你的帮助,勇敢的读者

这是我的指令代码:

'use strict';

/* Directives */

angular.module('myApp.directives', []).
    directive('appVersion', ['version', function (version) {
        return function (scope, elm, attrs) {
            elm.text(version);
        };

    }])

    .directive('bpmShowAdmin', function ($rootScope, $scope, syncData, waitForAuth) {
        return {
            restrict: 'A',
            compile: function (el, attr) {
                el.addClass('hide');
                waitForAuth.then(function () {
                    console.log('checking for admin rights');
                    var admins = syncData('admins');

                    admins.$on("loaded", function () {
                        var isAdmin = $rootScope.auth.user.uid in admins;
                        if (isAdmin) {
                            console.log('admin rights granted!');

                            el.toggleClass('hide', !isAdmin);
                        }
                    });
                });

                $rootScope.$on("$firebaseSimpleLogin:logout", function () {
                    el.toggleClass('hide', true);
                });
            }
        }
    });
该指令的使用方式如下:

<li bpm-show-admin>
    ...
</li>
这在大多数情况下都有效,但我显然不了解编译/链接阶段或类似的内容。当我第一次登录我的应用程序时,它并不总是显示我作为管理员登录时应该显示的所有内容。它在一两次刷新后工作,因此在我将指令逻辑编译与链接与控制器放在哪里时,存在某种竞争条件或问题

我一直以AngularFire种子项目的ngShowAuth为例,我相信它是由臭名昭著的卡托武夫开发的

我做错了什么和/或不理解


谢谢你的帮助

我开始用小提琴来寻求进一步的帮助,但最终我对在小提琴中设置我过于复杂的情况感到愤怒,并自己解决了这件该死的事情。以下是我的想法:

'use strict';

angular.module('bpmWaitForAdmin', [])

    .service('bpmWaitForAdmin', function ($rootScope, syncData, waitForAuth) {
        return {
            init: function (auth) {
                $rootScope.$on('$firebaseSimpleLogin:login', function (e, user) {
                    var admins = syncData('admins');

                    admins.$on("loaded", function () {
                        if (user.uid in admins) {
                            $rootScope.$broadcast('bpmWaitForAdmin:true');
                        }

                        else {
                            $rootScope.$broadcast('bpmWaitForAdmin:false');
                        }
                    });
                });

                $rootScope.$on('$firebaseSimpleLogin:logout', function () {
                    $rootScope.$broadcast('bpmWaitForAdmin:false');
                });
            }
        };
    })

    .directive('bpmShowAdmin', function ($rootScope, $timeout) {
        return {
            restrict: 'A',
            compile: function (element, attributes) {
                element.addClass('hide');

                $rootScope.$on("bpmWaitForAdmin:true", function () {
                    $timeout(function () {
                        element.removeClass('hide');
                    });
                });

                $rootScope.$on("bpmWaitForAdmin:false", function () {
                    $timeout(function () {
                        element.addClass('hide');
                    });
                });
            }
        }
    });

啊,一种耻辱的生活。所有那些可怕的黑客和错过的最后期限。我们在看什么版本的angularFire?有没有可能创建一个提琴、代码笔或类似的东西,这样我们就可以看到它的作用?如果没有一个重新开始,这将是艰难的。