在AngularJS中使用ES6
本篇记录一些AngularJS结合使用ES6的各种写法。
ES6中module的导出导入
class MainController {
constructor(searchService){
this.searchService = searchService;
} search(){
this.searchService
.fetch(this.searchTerm)
.then(response => {
this.items = resposne.data.items;
})
}
} export {MainController}
如何把module中的Controller注册进module呢?
import {MainController } from './MainController';
import {searchService } from './SeachService'; angualr
.module('app',[])
.controller('mainController', MainController)
.service('searchService', searchService);
ES6中的继承
class PageController{
constructor(name){
this.name = name;
} sayHello(){
return 'Hello ' + this.name;
}
} export {PageController}
在另外一个文件中:
import {PageController} from './PageController'; class ProductPageController extends PageController {
constructor(){
super('jack');
}
} export {ProductPageController}
最后注册到module中去:
angular
.module('app',[])
.controller('ProductPageController', ProductPageController);
ES6中Service和Controller的写法
class UserService{
constructor($http){
this.$http = $http;
} getFullName(){
return this.$http.get('api/user/details');
}
} class MyController{
//注意:定义时的class名是UserService,正真的名称是在service('realname',UserServie)中定义的
constructor(userService){
userService.getFullName().then(result => this.userName = result.fullName);
}
} angular.module('app')
.service('userService', UserService)
.controller('MyController', MyController);
ES6中Providers的写法
class MyProvider{
constructor(){
this.apiPath = 'default/api';
}
setApiPath(value){
this.apiPath = value;
}
$get($http){
return {
getThings: () => $http.get(this.apiPath);
}
}
}
ES6的Provider中依赖的注入是写在$get()中的,不能在constructor中注入。Provider中必须有$get()方法。
ES6中Factory的写法
class Thing{
constructor(){
console.log('create the thing');
showMsg();
}
showMsg(){
console.log('some msg');
}
} class ThingFactory{
constructor($timeout){
this.$timeout = $timeout;
} createThing(){
return this.$timeout(() => new Thing(),1000);
}
}
如何往module中注册呢?
● 第一种写法
angular.module('app')
.factory('thingFactory', () => new ThingFactory());
以上写法是错误的,因为$timeout还没有注入进去。可以这样写。
angular.module('app')
.factory('thingFactory', ['$timeout', ($timeout) => new ThingFactory($timeout)]);
● 第二种写法
但,以上的写法也不是最理想的。最好是写在类中。
class ThingFactory{
constructor($timeout){
this.$timeout = $timeout;
} createThing(){
return this.$timeout(() => new Thing(),1000);
}
} ThingFactory.$inject = ['$timeout'];
然后,
angular.module('app')
.factory('thingFactory', () => new ThingFactory());
● 第三种写法
class ThingFactory{
constructor($timeout){
this.$timeout = $timeout;
} createThing(){
return this.$timeout(() => new Thing(),1000);
}
} ThingFactory.$inject = ['$timeout']; var constructorFn = ThingFactory; //args = ['$timeout']
var args = constructorFn.$inject; //根据参数创建ThingFactory实例,任意多的参数
var factoryFunction = (...args) => {
return new constructorFn(...args);
} //['$timeout', ($timeout) => new ThingFactory($timeout)]
var factoryArray = args.push(factoryFunction); angular.module('app')
.factory('thingFactory', factoryArray);
ES6中Directive的写法
class MyDirective{
constructor($interval){
this.template = '<div>I\'m a directive</div>';
this.restrict = 'E';
this.scope = {};
this.$interval = $interval;
} compile(tElement){
tElement.css('position','absolute');
} link(scope, element){
this.$interval(() => this.move(element),1000);
} move(element){
element.css('left', (Math.random() * 500) + 'px');
element.css('top', (Math.random() * 500) + 'px');
}
}
以上,如果同时使用compile和link方法,link方法应该是compile的返回值。
compile(tElement){
tElement.css('position','absolute');
return this.link;
}
以上,当angular调用this.link方法,将不会在MyDirective的当前上下文中,调用this.$interval(() => this.move(element),1000);会报undefined类型错误。
如果改成这样:
compile(tElement){
tElement.css('position','absolute');
return (scope, element) => {
this.$interval(() => this.move(element),1000);
};
}
这里,当使用=>后,调用this.$interval(() => this.move(element),1000);方法能保证还MyDirective所在的当前上下文中。
还可以这么写:
compile(tElement){
tElement.css('position','absolute');
return this.link.bind(this);
} link(scope, element){
this.$interval(() => this.move(element),1000);
}
但, 以上所有的做法都必须调用compile方法,而在实际场景中,调用compile方法不是必须的。最好这样写:
var constructorFn = MyDirective; //是否有compile方法
if (!constructorFn.prototype.compile) {
// 如果没有,通过原型创建compile方法
constructorFn.prototype.compile = () => {};
} var originalCompileFn = _cloneFunction(constructorFn.prototype.compile); //重写compile方法
_override(constructorFn.prototype, 'compile', function () {
return function () { //先调用原先的compile方法
originalCompileFn.apply(this, arguments); //如果Directive包含link方法再执行link方法,绑定正确的上下文
if (constructorFn.prototype.link) {
return constructorFn.prototype.link.bind(this);
}
};
});
往module注册controller、factory、provider等的帮助方法
Michael Bromley还专门写了一个帮助方法,在这里。
大致这样使用:
class MyAngularComponent {
/*@ngInject*/
constructor(dependency1, dependency2) {
this.dependency1 = dependency1;
// stuff happens here
}
someMethods() {
this.dependency1.doThatThing();
// more stuff here
}
} register('app')
.controller('MyController', MyAngularComponent)
.service('myService', MyAngularComponent)
.provider('myOtherService', MyAngularComponent)
.factory('myFactory', MyAngularComponent)
.directive('myDirective', MyAngularComponent);
参考资料:
http://blog.thoughtram.io/angularjs/es6/2015/01/23/exploring-angular-1.3-using-es6.html
http://www.michaelbromley.co.uk/blog/350/exploring-es6-classes-in-angularjs-1-x
https://github.com/timroes/angular-es6-sample
在AngularJS中使用ES6的更多相关文章
- angularJS中的Promise对象($q)的深入理解
原文链接:a better way to learn AngularJS - promises AngularJS通过内置的$q服务提供Promise编程模式.通过将异步函数注册到promise对象, ...
- Angularjs中的promise
promise 是一种用异步方式处理值的方法,promise是对象,代表了一个函数最终可能的返回值或抛出的异常.在与远程对象打交道非常有用,可以把它们看成一个远程对象的代理. 要在Angular中创建 ...
- angularJS中XHR与promise
angularJS应用是完全运行在客户端的应用,我们可以通过angularJS构建一个不需依赖于后端,同时能够实现动态内容和响应的web应用,angularJS提供了将应用与远程服务器的信息集成在一起 ...
- AngularJS中get请求URL出现跨域问题
今天早上帮助同学看了一个AngularJS的问题,主要是请求中出现了跨域访问,请求被阻止. 下面是她给我的代码: <html lang="en" ng-app="m ...
- AngularJS 中的Promise --- $q服务详解
先说说什么是Promise,什么是$q吧.Promise是一种异步处理模式,有很多的实现方式,比如著名的Kris Kwal's Q还有JQuery的Deffered. 什么是Promise 以前了解过 ...
- AngularJS中的表单验证
AngularJS中的表单验证 AngularJS自带了很多验证,什么必填,最大长度,最小长度...,这里记录几个有用的正则式验证 1.使用angularjs的表单验证 正则式验证 只需要配置一个正则 ...
- 关于angularjs中的jQuery
关于angularjs中的jQuery 下面是一个小例子,用来说明我经常看到的一种模式.我们需要一个开关型的按钮.(注意:这个例子的代码有点装逼,并且有点冗长,只是为了用来代表更加复杂一些的例子,这些 ...
- angularjs中的directive scope配置
angularjs中的directive scope配置 定义directive其中重要的一环就是定义scope,scope有三种形式: 默认的scope,DOM元素上原有的scope scope: ...
- angularjs中provider,factory,service的区别和用法
angularjs中provider,factory,service的区别和用法 都能提供service,但是又有差别 service 第一次被注入时实例化,只实例化一次,整个应用的生命周期中是个单例 ...
随机推荐
- 解决创建maven项目Could not resolve archetype org.apache.maven.archetypes:maven-archetype-quickstart问题
今天用eclipse创建项目的时候报错如下图: 解决方案: 1.下载最新版maven-archetype-quickstart-1.1.jar 2.命令行到下载目录下执行mvn install:i ...
- 测试开发之Django——No2.Django的安装以及项目创建
开发平台:Mac Python版本:3.7 Django版本:2.0.5 一.Django的安装 1.pip安装 输入命令pip install Django==2.0.5 说明:不指定版本,则安装的 ...
- java Set(集合)
set不保存重复的元素(至于如何判断元素相同则较为复杂,后面将会看到).Set中最常被使用的是测试归属表,你可以很容易地询问某个对象是否在某个Set中,正因如此,查找就成了Set最重要的操作,因此通常 ...
- springMVC:将controller中数据传递到jsp页面
1> 将方法的返回值该为ModelAndView在返回时,将数据存储在ModelAndView对象中如: newModelAndView("/WEBINF/jsp/showData.j ...
- IntelliJ IDEA快捷键:Ctrl+空格
The Code Completion feature lets you quickly complete different kinds of statements in the code.For ...
- Git(四)Git的分支管理
一. 创建合并分支原理 在我们每次的提交,Git都把它们串成一条时间线,这条时间线就是一个分支.截止到目前,只有一条时间线,在Git里,这个分支叫主分支,即master分支.HEAD指针严格来说不是指 ...
- centos7配置svn钩子hooks脚本自动同步代码到项目目录
由于项目需要,svn提交后的代码希望再测试服务器上测试,每次提交后还要手动去svn update一次 十分麻烦,配置好svn钩子以后就省去了这些麻烦. 进入svn版本库目录找到hooks目录找到文件p ...
- 【LOJ】#2110. 「JLOI2015」管道连接
题解 我们先跑一个斯坦纳树出来 斯坦纳树是什么,是一个包含点集里的点联通所需要的最小的价值,显然他们联通的方式必然是一棵树 我们可以设一个状态为\(dis[i][S]\)表示以第i个点为根,点集为\( ...
- echarts地图定时切换散点及多图表级联联动
本文目录 1. 摘要 2.引入ECharts以及地图相关json 3. 界面布局 4. js实现图形布局 5.定时循环jquery实现 6. 总结 1. 摘要 最近做项目遇到个统计相关需求,一个页面 ...
- Xamarin iOS教程之编辑界面编写代码
Xamarin iOS教程之编辑界面编写代码 Xamarin iOS的Interface Builder Interface Builder被称为编辑界面.它是一个虚拟的图形化设计工具,用来为iOS应 ...