angular "controller as syntax" "this" data
angular "controller as syntax" "this" data
我不明白我错过了什么\n我在HTML上没有得到结果,我认为这个问题与controllerAs
语法有关\n注意:我可以在控制台中看到结果console.log(this.movie);
- 这是从控制器中的代码\napp.js\n
var app = angular.module('mfApp',['ngRoute', 'appControllers']); app.config(function($routeProvider){ $routeProvider. when('/:detail',{ templateUrl: 'template/detail.html', controller : 'detailCtrl' , controllerAs: 'movieAs' }).otherwise({ redirectTo: '/' }); });
\ncontroller.js\n
var mfControllers = angular.module('appControllers', []); mfControllers.controller('detailCtrl', ['$scope', '$routeParams', 'appServices', function($scope, $routeParams, appServices){ this.movie = []; this.id = $routeParams.detail; appServices.homeSearch(this.id).success(function(response){ this.movie = response; console.log(this.movie); // 是的,我在控制台中得到了数组结果 }); }]);
\nhtml - template/detail.html\n我的尝试\n
{{movieAs.Title}} {{movieAs.movie.Title}} {{movie.movieAs.Title}} {{movie.Title}} {{title}}
问题是由于错误的this
引用引起的。
在使用controllerAs
语法时,一个很好的做法是在控制器的最开始将this
赋值给vm
。这样可以正确地保持控制器的引用。
这是必要的,因为JavaScript的函数作用域。在这里详细解释会很长,但是要点是function
会创建一个新的作用域,函数内部的this
会不同。Todd Mott在他的文章中对此进行了很好的阐述。
还有一个问题,请问我们每个控制器都在控制器脚本的开头更改'var vm = this'是一个好方法吗?
是的。它有两个目的:1)它解决了this
的问题,2)很明确vm
是指控制器。顺便说一下,vm
代表"View Model",这才是控制器真正的含义。
AngularJS中的"controller as syntax"是一种用于控制器的语法,它将控制器中的数据和方法绑定到一个对象上,而不是直接绑定到$scope上。在上面的代码中,我们可以看到控制器使用了"controller as"语法,将其绑定到了变量me上。
在代码中的success回调函数中,我们可以看到使用了this关键字来引用控制器的作用域。然而,由于JavaScript中函数是作为对象存储的,所以在这个回调函数中,this关键字实际上指向的是这个方法本身,而不是控制器的作用域。
为了解决这个问题,最好的做法是将控制器的引用存储在一个变量中,并在回调函数中使用这个变量来访问控制器的作用域。在上面的代码中,我们可以看到控制器的引用被存储在了变量me中,并且在回调函数中使用了me来访问控制器的作用域。
通过将控制器的引用存储在一个变量中,我们可以确保在回调函数中访问到正确的作用域,而不会受到this关键字的影响。
在AngularJS的最佳实践中,推荐使用"controller as"语法,并将控制器的引用存储在一个变量中,以避免this关键字的混淆。这样做可以使代码更清晰、更易读,并且符合代码风格指南的推荐。
所以,将控制器的引用存储在一个变量中,并在回调函数中使用这个变量来访问控制器的作用域,是解决上述问题的最佳做法。