在angularJS中使用rootscope将值从一页传递到另一页

时间:2018-08-10 12:31:24

标签: angularjs angular-ui-router rootscope

Login.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错误,该错误在控制台中未定义。如何解决这个问题

5 个答案:

答案 0 :(得分:2)

$ 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;
});

答案 1 :(得分:1)

在这里,您的问题有一个有用的答案: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 })

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

答案 2 :(得分:0)

请确保您接受georgeawg的建议,我认为他的建议似乎是实现此功能的最佳方法。

我想建议您的示例出什么问题。

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

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

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

app.controller(...

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


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

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

app.controller(...

此外,您还需要在完整的代码中删除所有其他var app =,因为它们会创建同一应用的多个实例。

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

答案 3 :(得分:0)

在您的主要js中添加它。

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

答案 4 :(得分:0)

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

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