如何在 Angular JS 中检索$scope值定义的函数之外的值
How to retrive a $scope value outside the function it is defined, in Angular JS
我有控制器
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();
方法
您的问题的答案有很多方法。它们是:
- 使用
value
或service
,您可以在controllers
需要的地方调用它。 - 使用
$rootScope
,这是非常常见且易于使用的。只需在main controller
或任何首先调用的控制器中定义您的$rootScope
,然后您就可以像任何$scope
行为一样从其他控制器调用它。 - 使用
$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');
}
});
}
}
- 用嵌套函数和默认函数定义函数
- 自定义函数中的光标位置
- Jquery未定义函数正在停止其他操作
- 在不破坏未定义函数的情况下,对多个视图使用单个js文件
- javascript无法重新定义函数内部的全局对象
- 定义函数时,如何捕获外部变量的当前值
- 能够在定义函数表达式之前使用它
- Google Sheet自定义函数返回0
- Javascript-defineProperty和直接在对象上定义函数之间的区别
- 其中是自定义函数中的属性
- 创建自定义函数以在函数上运行完整的多选下拉列表
- Google Sheets自定义函数条件格式
- 为什么当我需要位于顶部的函数时,在脚本中的某些点上没有定义函数
- 使用变量的名称,然后为该变量定义函数
- dalek回调或自定义函数
- 如何在angular ui模态控制器中定义函数
- Uncaught ReferenceError:尝试在Android网络视图中访问时未定义函数
- UI网格:如何从自定义函数访问MODEL_COL_FIELD
- 在构造函数中定义函数会比将其附加到原型消耗更多的内存
- 使用 Javascript 中的函数重新定义函数