【问题标题】:Angular 1.4 using ES6/ES7 [closed]使用 ES6/ES7 的 Angular 1.4 [关闭]
【发布时间】:2015-07-18 14:53:59
【问题描述】:

我正在开始一个新项目,并希望将 Angular 1.4 与 ES6 类一起用于控制器、服务和指令。我能找到的最好看的代码倾向于使用某种装饰器,比如@Component,但这似乎是 ES7 的一个实验性特性。对于现实世界的 Angular 1.4 应用程序,ES6 中的控制器、服务和指令有哪些示例?我的项目设置为使用 Babel 进行转译。

【问题讨论】:

    标签: angularjs ecmascript-6 ecmascript-2016


    【解决方案1】:

    使用 Angular 1.x 的 ES6 类构建项目还为时过早。如果您正在开始一个新项目,我建议您将 TypeScript 或 ES6 与 Angular 1.4 或 1.3 一起使用。然后,您可以将其转换为 ES5,这是当今所有浏览器都支持的 JavaScript 版本。

    TypeScript 是添加了装饰器和类型注释的 ES6。

    您看到的 @Component 装饰器示例可能是针对 Angular 2 的。这些是 TypeScript 1.5 的一个特性。您今天可以使用装饰器。也就是说,您可能需要编写自己的装饰器来转换为 Angular 1.4 所期望的。今天你可能可以不用装饰器。

    使用 ES6 或 TypeScript,您的 ControllerService 类应如下所示:

    export class LoginController {
    
        static $inject = ['dataApi'];
        constructor(private dataApi: DataApi) {}
    
        submit(login: LoginRequest) {
            this.dataApi.login(login);
        }  
    
    }
    loginModule.controller('LoginController', LoginController);
    

    还有一项服务:

    export class DataApi {
    
        static $inject = ['$http'];
        constructor($http: ng.IHttpService) {}
    
        login(login: LoginRequest) {
            return this.$http.post('/api/login', login);
        }
    }
    loginModule.service('dataApi', DataApi);
    

    在此示例中,LoginRequest 是在别处定义的数据传输对象。

    更新:指令

    指令不是类,但您可以根据需要将它们创建为类。我更喜欢将它们创建为factories

    var DIRECTIVE = 'mmTitle';
    
    mmTitle.$inject = ['$window'];
    function mmTitle($window: ng.IWindowService, $parse: ng.IParseService): ng.IDirective {
    
        return {
            restrict: 'A',
            link: (scope, element, attrs) => {
    
                $window.document.title = $parse(attrs[DIRECTIVE])(scope);
    
                attrs.$observer(DIRECTIVE, value => $window.document.title = value);
            }
        }
    }    
    loginModule.directive(DIRECTIVE, mmTitle);
    

    【讨论】:

    • 确保您使用更现代的打字稿编译器之一,否则您的打字稿打字将无效。旧版本的 typescript(比如我公司使用的)不支持联合类型,这是 angular 和许多 javascript 库大量使用的东西。
    • 谢谢。我现在不会再把头撞到关于装饰师的墙上了。我可以让这些类与控制器和服务一起使用,但还没有完全让它与指令一起使用。我缺少一些绑定链接功能的东西,但如果我无法弄清楚,我会问一个单独的问题。
    • 我更新了示例以包含指令。
    • 谢谢马丁!我没有很快看到那个更新。我回来发布我能够为指令工作的内容。我遇到的问题是链接功能。 ctrl 在那里,但它只是我的控制器,并没有填充 $parsers 之类的东西。我最终意识到我需要 ngModel。 var MyDirective = angular.module('MyDirective', []) 类控制器 {
    • 抱歉格式化。我不知道如何让这条评论中的换行符起作用。 var MyDirective = angular.module('MyDirective', []); class Controller { constructor() { this.restrict = 'A' ; this.scope = {ngModel: '='}; this.require = "ngModel"; this.controller = Controller; this.controllerAs = "MyDirectiveCtrl" } link (scope, elem, attrs, ctrl) { console.log(ctrl.$parsers); } } Controller.$inject=[]; MyDirective.directive("myDirective", ()=>new Controller()); export default MyDirective;
    猜你喜欢
    • 1970-01-01
    • 2016-09-08
    • 1970-01-01
    • 2016-07-19
    • 2017-03-04
    • 1970-01-01
    • 2020-04-28
    • 2016-05-17
    • 2019-09-21
    相关资源
    最近更新 更多