【问题标题】:How do I write angular2 without decorator syntax?如何在没有装饰器语法的情况下编写 angular2?
【发布时间】:2016-03-24 22:52:35
【问题描述】:

我大致关注JavaScript/TypeScript quickstart for Angular2ES6 中编写我的应用程序,但无法让装饰器工作

entry.js

import * as stylesheet from '../assets/styles/app.scss';

import jQuery from '../node_modules/jquery/dist/jquery';
import $ from '../node_modules/jquery/dist/jquery';
import * as semanticUi from '../node_modules/semantic-ui/dist/semantic';

import '../node_modules/angular2/bundles/angular2-polyfills'
import '../node_modules/rxjs/bundles/Rx.umd'
import '../node_modules/angular2/bundles/angular2-all.umd'

import {bootstrap}    from '../node_modules/angular2/bootstrap'
import {AppComponent} from './app.component'

bootstrap(AppComponent);

app.component.js

import {Component} from '../node_modules/angular2/core';

@Component({
    selector: 'my-app',
    template: '<h1>Hello {{ name }}</h1>'
})
export class AppComponent {
    constructor() {
        this.name = 'Max';
        console.log(this.name);
    }
}

package.json

{
    "scripts": {
        "build:app": "browserify -e ./app/index.js -o ./dist/app.js",
    },
    "devDependencies": {
        "babel-core": "6.3.x",
        "babel-plugin-angular2-annotations": "^3.0.3",
        "babel-plugin-transform-decorators": "^6.3.13",
        "babel-preset-es2015": "6.3.x",
        "babelify": "7.2.x",
        "cpy": "3.4.x",
    },
    "babel": {
        "presets": [
            "es2015"
        ],
        "plugins": [
            "angular2-annotation",
            "transform-decorators"
        ]
    },
    "browserify": {
        "transform": [
            [
                "babelify",
                {
                    "presets": [
                        "es2015"
                    ],
                    "plugins": [
                        "angular2-annotation",
                        "transform-decorators"
                    ]
                }
            ]
        ]
    }
}

错误

npm run build:app

> ng2-app@0.0.2 build:app /data/projects/ng2-app
> browserify -e ./app/index.js -o ./dist/app.js

ReferenceError: Unknown plugin "angular2-annotation" specified in "/data/projects/ng2-app/package.json" at 0, attempted to resolve relative to "/data/projects/ng2-app" while parsing file: /data/projects/ng2-app/app/index.js
    at /data/projects/ng2-app/node_modules/babel-core/lib/transformation/file/options/option-manager.js:193:17
    at Array.map (native)
    at Function.normalisePlugins (/data/projects/ng2-app/node_modules/babel-core/lib/transformation/file/options/option-manager.js:173:20)
    at OptionManager.mergeOptions (/data/projects/ng2-app/node_modules/babel-core/lib/transformation/file/options/option-manager.js:271:36)
    at OptionManager.addConfig (/data/projects/ng2-app/node_modules/babel-core/lib/transformation/file/options/option-manager.js:221:10)
    at OptionManager.findConfigs (/data/projects/ng2-app/node_modules/babel-core/lib/transformation/file/options/option-manager.js:370:30)
    at OptionManager.init (/data/projects/ng2-app/node_modules/babel-core/lib/transformation/file/options/option-manager.js:412:12)
    at File.initOptions (/data/projects/ng2-app/node_modules/babel-core/lib/transformation/file/index.js:191:75)
    at new File (/data/projects/ng2-app/node_modules/babel-core/lib/transformation/file/index.js:122:22)
    at Pipeline.transform (/data/projects/ng2-app/node_modules/babel-core/lib/transformation/pipeline.js:42:16)

npm ERR! Linux 3.13.0-71-generic
npm ERR! argv "/usr/bin/nodejs" "/usr/bin/npm" "run" "build:app"
npm ERR! node v5.3.0
npm ERR! npm  v3.5.3
npm ERR! code ELIFECYCLE

问题

  • 我不关心使用 decorator 语法,所以我可以重写它以使用 ES6/ES2015 代替吗?

【问题讨论】:

    标签: ecmascript-6 decorator browserify angular babeljs


    【解决方案1】:

    这是因为您使用的是 Babel 6,并且装饰器目前已禁用,但您可以使用旧插件 transform-decorators-legacy 使其工作。禁用的原因是语法会在不久的将来发生变化。 https://github.com/loganfsmyth/babel-plugin-transform-decorators-legacy

    【讨论】:

      【解决方案2】:

      你可以使用 ES5 语法:

      import * as ng from 'angular2/core';
      
      const SomeComponent = ng
      .Component({ /* ... */})
      .View({ /* ... */ })
      .Class({
          constructor() {}
      });
      
      const SomeDirective = ng
      .Directive({ /* ... */ })
      .Class({
          constructor() {}
      });
      

      所以对于你的情况,它会是(见this plunk):

      export const AppComponent = Component({
        selector: 'my-app',
        template: '<h1>Hello {{ name }}</h1>'
      })
      .Class({
        constructor() {
          this.name = 'Max';
          console.log(this.name);
        }
      });
      

      PS 但如果我是你,我会尝试解决问题并继续使用 ES7 装饰器。也许你忘记了npm install

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-05
      • 2018-12-17
      • 1970-01-01
      • 2019-03-06
      • 2011-05-20
      • 2015-05-20
      • 1970-01-01
      • 2019-03-25
      相关资源
      最近更新 更多