如何在 Angular JS 中检索$scope值定义的函数之外的值

How to retrive a $scope value outside the function it is defined, in Angular JS

本文关键字:定义 函数 scope Angular JS 检索      更新时间:2023-09-26

我有控制器

function loginController($scope, $http, $cookieStore, $location) {
var token = $cookieStore.get('token');
var conId = $cookieStore.get('Cont_Id');
var exId = $cookieStore.get('ex_Id');
    $scope.log_me = function() {
    $scope.login_me = [];
    var login_un = $scope.uservals;
    var login_pwd = $scope.passvals;
    var logs_me = "api call here";
    $http.get(logs_me)
        .success(function(response) {
            $cookieStore.put('token', response.token);
            $cookieStore.put('ex_Id', response.ExId);
            $cookieStore.put('Cont_Id', response.contactId);
            $cookieStore.put('email', response.email);
            $cookieStore.put('name', response.name);
            $scope.log_sess = response;
            $scope.sess_id= response.ss_id;
            alert($scope.sess_id);
            if (response.status == "failure, invalid username or password") {
                $('.login_error').show();
                $('.login_error').html('Invalid username or password');
                $('.login_error').delay(4000).fadeOut();
                $('.loading').hide();
            } else {
                $location.path('/dashboard');
            }
        });
  }

}

我在登录页面中使用了上述控制器,它工作正常。现在我想在另一个模板中使用相同的控制器并检索值"$scope.sess_id"

我的模板是

 <div class="page" >
 <style>
 #report_loader object {
   width: 100%;
   min-height: 700px;
   width:100%;
   height:100%;
 }
 </style>
 <div class="loading"> </div>
 <section class="panel panel-default" data-ng-controller="loginController">
        <div class="panel-body" style=" position: relative;">
            <div id="report_loader" style="min-height:600px;">
            {{sess_id}}
             <script type="text/javascript">
                $("#report_loader").html('<object data="https://sampleurl/contact/reports/members/sorted_list.html?ss_id=' + sess_id+' />');
            </script>
            </div>
            </div>
    </section>
 </div>

我无法在此处检索值 {{sess_id}}。应该怎么做才能在我的模板中引入此值

成功登录后,您将用户路由到"仪表板"路由。尽管您可能觉得您对登录和仪表板使用相同的"loginController",但它将是控制器和$scope的全新实例。这就是 {{sess_id}} 未显示在仪表板模板上的原因。

如果您遵循类似 MVC 的 AngularJS 模式,理想情况下,您希望为仪表板模板创建一个新控制器。请参阅说明:https://docs.angularjs.org/guide/controller#using-controllers-correctly

因此,我将创建一个 DashboardCtrl 并在两者之间共享sess_id。有很多关于如何在控制器之间共享数据的示例:

  • 您可以使用工厂:在 AngularJS 控制器之间共享数据
  • 您可以使用$rootScope:如何在 Angular 中使用$rootScope来存储变量?

希望对您有所帮助。

我会使用 rootScope 方法,但更简单的方法是简单地创建一个"全局"变量。

控制器(不是登录控制器(中,定义一个全局作用域变量,如下所示:

$scope.global = {};

然后在登录控制器中,修改会话 ID 以使用全局变量:

$scope.global.sess_id= response.ss_id;
alert($scope.global.sess_id);

然后在您的 html 中:

<div id="report_loader" style="min-height:600px;">
{{global.sess_id}}

它很简单,就像冠军一样工作。

我会创建一个服务:

services.sessionService = function(){
    var sessionID = null;
    this.setSessionID = function(id){
         sessionID = id; 
    }
    this.getSessionID = function(){
        return sessionID;
    }
}

然后在您的控制器中:

$scope.sess_id= response.ss_id;
alert($scope.sess_id);
sessionService.setSessionID( $scope.sess_id );

在您的仪表板控制器中:

$scope.sess_id = sessionService.getSessionID();

方法

您的问题的答案有很多方法。它们是:

  1. 使用 valueservice ,您可以在controllers需要的地方调用它。
  2. 使用$rootScope,这是非常常见且易于使用的。只需在main controller或任何首先调用的控制器中定义您的$rootScope,然后您就可以像任何$scope行为一样从其他控制器调用它。
  3. 使用$controller服务或通常称为controller inheritance。在控制器函数的参数中定义它,然后键入$controller('ControllerNameThatIWantToInheritance', {$scope:$scope});

也许可以使用任何其他方法。他们每个人都有优势和劣势。

例子:

使用价值

.value('MyValue', {
  key: null
})
.controller('MyCtrl', function ($scope, MyValue) {
  $scope.myValue = MyValue;
})

您也可以从服务中修改MyValue。

使用$rootScope

.controller('FirstCtrl', function ($scope, $rootScope) {
  $rootScope.key = 'Hello world!';
})
.controller('SecondCtrl', function ($scope, $rootScope) {
  console.log($rootScope.key);
})

将打印"Hello World",您也可以在视图中使用它<div>{{key}}</div>

使用$controller

.controller('FirstCtrl', function ($scope) {
  $scope.key = 'Hello world!';
})
.controller('SecondCtrl', function ($scope, $controller) {
  $controller('FirstCtrl', {$scope:$scope});
})

第二个控制器将具有与第一个控制器类似的$scope

结论

在您的问题中,您可以拆分控制器以方便使用。但是,如果您不想,请尝试先定义$scope.sess_id。它会告诉 Angular 你的sess_id是一个定义的模型,angular 会观察它们(如果你不先定义它,它将是"未定义的",将被忽略(。

function loginController($scope, $http, $cookieStore, $location) {
var token = $cookieStore.get('token');
var conId = $cookieStore.get('Cont_Id');
var exId = $cookieStore.get('ex_Id');
$scope.sess_id = null                   //<- add this
$scope.log_me = function() {
  $scope.login_me = [];
  var login_un = $scope.uservals;
  var login_pwd = $scope.passvals;
  var logs_me = "api call here";
  $http.get(logs_me)
    .success(function(response) {
        $cookieStore.put('token', response.token);
        $cookieStore.put('ex_Id', response.ExId);
        $cookieStore.put('Cont_Id', response.contactId);
        $cookieStore.put('email', response.email);
        $cookieStore.put('name', response.name);
        $scope.log_sess = response;
        $scope.sess_id= response.ss_id;
        alert($scope.sess_id);
        if (response.status == "failure, invalid username or password") {
            $('.login_error').show();
            $('.login_error').html('Invalid username or password');
            $('.login_error').delay(4000).fadeOut();
            $('.loading').hide();
        } else {
            $location.path('/dashboard');
        }
    });
  }
}