【问题标题】:Define and Access $rootScope with controller as syntax使用控制器作为语法定义和访问 $rootScope
【发布时间】:2015-11-13 16:39:50
【问题描述】:

当我需要定义 $rootScope 变量值时,我无法使用 controller as

该过程包括两个主要阶段。

  • 用户未登录,因此当他处理登录表单时,我将在 LoginController 内的 $rootScope 上定义他的个人数据(如姓名和 ID)。
  • 用户已经登录(本地存储中有数据),所以我将从本地存储中获取他的数据并在.run 上设置$rootScope 值;

但问题是,由于我不熟悉这种类型的语法(使用带有 vm attr 的 'controller as'),$rootScope 没有被定义,也没有被视图访问。

这就是我正在做的:

.运行

angular
    .module('agApp')
    .run(runAuth);

    /* @ngInject */
    function runAuth($rootScope,factAuth,localStorageService) {

        var user = JSON.parse(localStorageService.get("user"));
        if (user.length > 0) {
            $rootScope.userData = user[0];
        }

        $rootScope.logOut = function() {
            factAuth.logOut();
            $rootScope.userData = '';
            $state.go('login');
        };

    }; //end run

控制器

angular
    .module('agApp')
    .controller('LoginController', LoginController);

    /* @ngInject */
    function LoginController($rootScope,$http,$state,localStorageService,factAutenticacao) {
        var vm = this;
        vm.pageName = 'Login page';

        vm.loginProccess = loginProccess;

        function loginProccess(event) {
            //here i get an $htt to validate the login
            if (!data) {
                alert('login failed')
            } else {
                factAutenticacao.loginProcess();
                localStorageService.set("user", JSON.stringify(data[0]));
                $rootScope.userData = data[0];
                $state.go('app');
            };
        };

    }; //end login controller

顺便说一句,在定义全局函数时也会出现同样的问题,例如“logOut”函数。

在我看来,我正在尝试像这样访问这些数据:

<div class="col-l-12">
    <h3>User: {{::vm.userData.name}}</h3>
    <ul>
        <li> {{::vm.userData.id}}</li>
        <li> {{::vm.userData.location}}</li>
        [.. more code ..]
    </ul>
</div>

由于它是一个全局变量,我不想将它与特定的 controller 关联,因为它需要在整个应用程序中都可以访问。

怎么了?

【问题讨论】:

  • 您是否考虑过将 userData 和 logout 函数抽象为使用 localStorageService 的单独服务?
  • 我现在正在这样做。但是例如我需要显示用户数据,并且在其他场合也需要使用它的数据,例如uniqueID,例如:添加新产品,开票等。可以吗?我正在尝试将登录/身份验证构建为单独的模块。

标签: angularjs


【解决方案1】:

视图使用vm.userData,其中vm 是控制器本身。所以,如果你想让它工作,userData 必须是控制器的字段,而不是根范围的字段:

vm.userData = data[0];

而不是

$rootScope.userData = data[0];

或者,如果你真的想将它存储在 $rootScope 上,那么视图应该使用

{{ userData.name }}

从控制器范围获取 userData,并通过继承从根范围获取。

我同意 cmets 的观点:那不应该在根范围内。它应该在一个专用服务中,注入到需要访问用户数据的任何控制器中。

【讨论】:

  • 我现在建立了自己的工作流程。但是,假设这个 userData 用于在左侧导航栏上显示一条带有企业徽标的欢迎消息,并且还在主视图中定义用户的票证。你的意思是我最好有一个工厂服务来在需要时调用这些数据而不是 rootScope 定义?因为这是我打算使用的唯一 rootScope。我知道这是我应该避免的。
  • 我更希望通过服务公开它,是的。
  • 好的。我会遵循这个工作流程。但是注销过程呢?我该怎么称呼这个?你能提供一个基本的例子吗?
猜你喜欢
  • 1970-01-01
  • 2016-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-06
  • 2014-07-27
  • 2015-09-01
相关资源
最近更新 更多