【问题标题】:pass the value from one page to another using rootscope in angularJS在angularJS中使用rootscope将值从一个页面传递到另一个页面
【发布时间】:2018-10-03 15:03:49
【问题描述】:

登录.js:

app.controller('LoginFormController', ['$scope','$http','$rootScope', '$state', function($scope, $http, $rootScope, $state) {
    $scope.user = {};
    $scope.authError = null;
    $scope.login = function() {
      $scope.authError = null;

      var emailId = $scope.user.email;
      var password = $scope.user.password;
      $http({
        url: 'http://localhost:8090/login/login',
        method: 'POST',
        headers: {
          'Content-Type': 'application/x-www-form-urlencoded'

        },
        data: 'email='+emailId+'&password='+password
        //data: {'email': $scope.user.email, 'password': $scope.user.password}
      }).then(function(response) {
        console.log(response.data);


        if (response.data.status == 'SUCCESS') {

          $scope.user = response.data.user.firstName;
          $rootScope.test = response.data.user.firstName;
          console.log("check: ",$rootScope.test)
          $state.go('app.dashboard');
        } else {
          //alert('invalid login');
          $scope.authError = 'Email or Password not right';
        }
      }, function(x) {
        $scope.authError = 'Server Error';
      })
    };
}])

我将值保存在 $rootScope.test 下

这是我的 App.main.js:

'use strict';
  angular.module('app').controller('AppCtrl', ['$scope','$rootScope',
   function($scope, $rootScope) {

    $scope.user5 = $rootScope.test;

  }
 ]);

试图打印根范围

如果我运行此代码,我将面临 $rootScope 在控制台中未定义的错误。如何解决这个问题

【问题讨论】:

标签: angularjs angular-ui-router rootscope


【解决方案1】:

$rootScope 是所有 $scope 的父级,每个 $scope 都会收到一份 $rootScope 数据的副本,您可以使用 $scope 本身访问这些数据。

这里是修改版 https://jsfiddle.net/sedhal/g08uecv5/17/

angular.module('myApp', [])
.run(function($rootScope) {
    $rootScope.obj = {
      "name":"user1",
      "bdate":"18/11/1994",
      "city":"Ahmedabad"
    };
})
.controller('myCtrl', function($scope, $rootScope) {
      $scope.data = $rootScope.obj;
})
.controller('myCtrl2', function($scope, $rootScope) {
     $scope.data1 = $rootScope.obj;
});

【讨论】:

  • 这对我很有用@s​​edhal。
【解决方案2】:

您的问题在这里有一个有用的答案:https://stackoverflow.com/a/18881189/9013688

您可以发出一个事件,而不是直接在 $rootScope 上传递您的属性,该事件可以在您的应用程序的其他部分进行侦听,如下所示:

if (response.data.status == 'SUCCESS') {
  $rootScope.$emit('user-logged', response.data.user.firstName)
}

然后:

$rootScope.$on('user-logged', function(event, data){ do something with your data })

或者您可以使用一种服务,该服务是处理所有应用中数据的好方法。

【讨论】:

  • $broadcast$emit$on 已弃用。使用它们会使迁移到 Angular 2+ 变得更加困难。
【解决方案3】:

请务必听取georgeawg 的建议,在我看来,他的建议似乎是实现此功能的最佳方式。

我想建议您的示例可能有什么问题。

如果您可以在主 App.main.js 中看到您已将声明声明为

angular.module('app').controller(...

但是您在login.js 中使用变量app,就像这样。

app.controller(...

我假设您正在其他地方创建。因此设置的rootscope 值丢失了,因为同一个应用程序有两个实例。


您的问题的解决方案是声明一个变量app,它将存储应用程序的实例。因此,您的解决方案的解决方法是将App.main.js 修改为这样。

var app = angular.module('app');

app.controller(...

您还需要在完整代码中删除任何其他任意 var app =,因为这些会创建同一应用的多个实例。

我希望我的解释是可以理解的和正确的猜测,请尝试这个解决方案!

【讨论】:

    【解决方案4】:

    在你的主 js 中添加这个。

    app.run(['$rootScope', function($rootScope) {
      $rootScope.test; 
    }]);
    

    【讨论】:

      【解决方案5】:

      这是乔治建议的示例实现,这是处理此问题的正确方法。

      app.controller('LoginFormController', ['$scope','$http','$rootScope', '$state', 'stateService', function($scope, $http, $rootScope, $state, stateService) {
          var userFirstName = 'John';
          stateService.setFirstName('Bill');
      
          userFirstName = stateService.getFirstName(); 
          console.log(userFirstName); // result will be 'Bill'
      }])
      

      还有我平时称之为stateService的服务

      app.factory('stateService', [factory]);
      
      function factory() {        
          var userFirstName = null;
      
          stateService.getFirstName = function() {
              return userFirstName;
          };
      
          stateService.setFirstName = function(firstName) {
              userFirstName = firstName;
          };
      
          return stateService;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多