AngularJS控制器初始化问题,当从$scope切换到"controller as"的形式
AngularJS controller initialization problems when switching from $scope to "controller as" form
当从$scope切换到"controller as"语法时,我遇到了"this"引用的麻烦。我需要调用一个服务来获取初始页面加载的一些数据。但是我得到的"this"指的是全局窗口对象,而不是练习控制器的实例。有点奇怪。以下是我所知道的。
AngularJS包含在我的主页…
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.3.14/angular.min.js"></script>
控制器是如何被包含到模板页面的
<div class="col-xs-9"
ng-include="'exercise/exercise_body.html'"
ng-show="mainController.showStatus.exercises"
ng-controller="ExerciseController as ec"
ng-init="ec.initialize()"></div>
这是来自ExerciseController的初始化函数。
this.initialize = function(){
// Item lists to display on different parts of the page
this.dataList = {};
this.dataList.exercises = [];
this.dataList.resources = [];
var promise = exerciseService.getExercises();
promise.then(function(res){
console.log(this); // this is a window object? why????
this.dataList.exercises = res.data.exercises;
});
}
最后,有来自Chrome的堆栈跟踪....
TypeError: Cannot set property 'exercises' of undefined
at app.js:82
at angular.js:13189
at l.$eval (angular.js:14401)
at l.$digest (angular.js:14217)
at l.$apply (angular.js:14506)
at l (angular.js:9659)
at S (angular.js:9849)
at XMLHttpRequest.D.onload (angular.js:9790)
留给我的是一个数据对象,即使在显式地设置了定义之后,它也是未定义的。有什么想法可以做些什么来解决这个问题或围绕这个问题工作?
这是一个非常典型的问题。给promise提供回调函数的方式会让它在全局上下文中被调用。你需要绑定回调函数到控制器上下文:
var promise = exerciseService.getExercises();
promise.then(function(res) {
this.dataList.exercises = res.data.exercises;
}.bind(this));
或者直接使用保留词法作用域的箭头函数:
var promise = exerciseService.getExercises();
promise.then(res => this.dataList.exercises = res.data.exercises);
如果你把
var vm = this;
你可以在任何地方使用vm来代替这个!:)
相关文章:
- 铬:“;未捕获的语法错误:意外的标记:"
- 可以设置“;文件名"发生错误时显示的内联脚本标记的
- JS表单提交"无法使用Chrome数据保护程序加载此页面.尝试重新加载页面.调试信息:POST CISmtuK
- 检测电话窃听,即:<a href="电话:xxx">在UIWebview上
- 使用“+="操作人员
- //而不是在src=“”上使用http://"属性
- "未捕获的语法错误:意外的标记}"
- 可以<脚本类型=“;text/javascript”>window.location=“/"</
- "实例范围”;TypeScript类的getter/setter
- Javascript复选框函数:;缺少:在属性id之后"
- "“;变量未引用正确的对象
- "日期“;AJAX请求返回的类型值未定义
- 得到"TypeError:无法读取属性'filename'未定义的“;调用“npm start
- Soundcloud api"未捕获的类型错误:无法读取属性'uri'“未定义”;
- "工具提示"jQuery插件坏了
- "锻造;React中的表达式
- 图像可以从源<img src=""/>.TEXT可以在没有javascript的情况下从外部
- 在MVC 4中,对Controller的Ajax调用为空
- 如何提取“;href"最近列表项中的属性值
- AngularJS'ng:areq错误参数"{controller}不是函数“;,CodeIgnite