Javascript 正确使用$emit方法显示模态

Javascript 正确使用$emit方法显示模态,javascript,angularjs,Javascript,Angularjs,我想知道如何正确地使用$emit方法,以便在我的错误回调中触发模态 我有以下工厂: angular.module('BBPlnkr').factory("Session", [ '$http', '$q', '$rootScope', function($http, $q, $rootScope) { var service; service = { requestCurrentUser: function() { if (service.isAu

我想知道如何正确地使用
$emit
方法,以便在我的错误回调中触发模态

我有以下工厂:

angular.module('BBPlnkr').factory("Session", [
  '$http', '$q', '$rootScope', function($http, $q, $rootScope) {
    var service;
    service = {
      requestCurrentUser: function() {
        if (service.isAuthenticated()) {
          return $q.when(service.currentUser);
        } else {

        }
        return $http.get('current_user').then(function(resp) {
          console.log(resp.data);
          service.currentUser = resp.data;
          return service.currentUser;
        }, function(resp) {
          if (resp.status === 401) {
            $rootScope.$emit("loginRequired", "err");
            console.log('You are not authetnicated');
          }
        });
      },
      currentUser: null,
      isAuthenticated: function() {
        return !!service.currentUser;
      }
    };
    return service;
  }
]);
该工厂只需检查用户是否为当前用户,如果不是,则返回401。我想做的是在调用这个错误回调时,在这个错误回调内部触发一个模态。现在我发现我可以使用
$emit
方法,但不确定是否正确使用了它。在错误回调中,我希望通过作用域链向上调度事件。这就是
$emit
正确的做法。但是我不能完全确定我是否正确设置了这个。所以在这样做的时候。我的控制器是这样的:

myApp.controller('MainController', ['$scope', '$rootScope', '$modal', '$location', '$route', function($scope, $rootScope, $modal, $location, $route) {

      $rootScope.$on('loginRequired', function(event, second_param){
        /* Do the modal stuff here??*/
    });
  }
]);
我知道我实际上没有做任何事情来触发模态($modal.open)。但我想知道我是否朝着正确的方向前进。如果没有,一些建议将是有益的。我在网上查找了有关
$emit
$broadcast
的文档。我知道两者的区别。一旦在作用域链上分派事件,一个在$scope链下分派事件。

选项1

angular.module('BBPlnkr').factory("Session", [
  '$http', '$q', '$rootScope','$scope', function($http, $q, $rootScope,$scope) {
    var service;
    service = {
      requestCurrentUser: function() {
        if (service.isAuthenticated()) {
          return $q.when(service.currentUser);
        } else {

        }
        return $http.get('current_user').then(function(resp) {
          console.log(resp.data);
          service.currentUser = resp.data;
          return service.currentUser;
        }, function(resp) {
          if (resp.status === 401) {
            $scope.$emit("loginRequired", "err");
            console.log('You are not authetnicated');
          }
        });
      },
      currentUser: null,
      isAuthenticated: function() {
        return !!service.currentUser;
      }
    };
    return service;
  }
]);
选择2

myApp.controller('MainController', ['$scope', '$rootScope', '$modal', '$location', '$route', function($scope, $rootScope, $modal, $location, $route) {
$rootScope.loginRequired = fn(){}

  }
]);

angular.module('BBPlnkr').factory("Session", [
  '$http', '$q', '$rootScope', function($http, $q, $rootScope) {
    var service;
    service = {
      requestCurrentUser: function() {
        if (service.isAuthenticated()) {
          return $q.when(service.currentUser);
        } else {

        }
        return $http.get('current_user').then(function(resp) {
          console.log(resp.data);
          service.currentUser = resp.data;
          return service.currentUser;
        }, function(resp) {
          if (resp.status === 401) {
            $rootScope.loginRequired()
            console.log('You are not authetnicated');
          }
        });
      },
      currentUser: null,
      isAuthenticated: function() {
        return !!service.currentUser;
      }
    };
    return service;
  }
]);
但我认为您过度使用了根作用域以及emit和broadcast的作用域

  • Emit和broadcast用于跨作用域进行通信,这里您用于在同一作用域中进行通信$rootScope是整个应用程序中唯一的一个。它是一种全局缓存
  • 由于rootScope在整个应用程序中是全局的和唯一的,所以您应该谨慎使用它。我会选择选项1,因为只有顶级模块正在访问rootScope,而这也只是为了听子作用域在做什么
  • 参考:$rootScope.Scope

    关于上面的Scope,所以我不会插话

    如果您正在寻找一种干净的方法来处理控制器中的对话框,那么这个线程有一个指令可以用于引导或类似的模态对话框框架

    使用指令和对话框标记,显示模式应该像
    $scope.showDialog=true一样简单从控制器中


    希望对您有所帮助。

    $rootScope位于顶部,因此您希望使用$broadcast发送。感谢您的详细解释。然而。。。选择1。我确信您无法在工厂级别访问
    $scope
    。此外,他还指出建议:使用$rootScope。$emit+$rootScope。$此外,
    $emit
    的使用会通过作用域层次结构向上发送事件名称,通知注册用户。因此,使用
    $emit
    而不是
    $broadcast
    是否明智?使用
    $broadcast
    的最初建议是可行的。在我的控制器中,我执行
    $scope.on('loginRequired,function(){console.log'something})哪个有效