我現在正在學習Angular2,問題是每當我找到一個好的教程(它不適合最新的Angular2版本)時,它就會改變。Angular2 RC.1注入
無論如何 - 我試圖從一個文件注入一個服務到另一個文件,但不能重複教程中的人。
這裏的鏈接教程:https://egghead.io/lessons/angular-2-injecting-a-service
./main.ts
import {bootstrap} from '@angular/platform-browser-dynamic';
import {Component} from "@angular/core";
import {TodoInput} from './todo-input';
import {TodoService} from "./todo-service";
@Component({
selector: 'my-app',
directives: [TodoInput],
template: '<div><todo-input></todo-input></div>'
})
class App{}
bootstrap(App, [TodoService]);
./todo-service.ts
import {Injectable} from "@angular/core";
@Injectable()
export class TodoService {
todos:string[] = [];
}
./todo -input.ts
import {Component} from "@angular/core";
import {TodoService} from "./todo-service";
@Component({
selector: 'todo-input',
template: `<div>
I'm a todo input
<input type="text" #myInput>
<button (mouseover)="onClick($event, myInput.value)">Click me</button>
</div>`
})
export class TodoInput{
constructor(todoService:TodoService) {
console.log(todoService);
}
onClick(event, value) {
console.log(event, value);
}
}
和我有一個控制檯:
EXCEPTION: TypeError: Cannot read property 'query' of null platform-browser.umd.js:962 EXCEPTION: TypeError: Cannot read property 'query' of nullBrowserDomAdapter.logError @ platform-browser.umd.js:962BrowserDomAdapter.logGroup @ platform-browser.umd.js:972ExceptionHandler.call @ core.umd.js:3696(anonymous function) @ core.umd.js:8982ZoneDelegate.invoke @ zone.js:323NgZoneImpl.inner.inner.fork.onInvoke @ core.umd.js:6075ZoneDelegate.invoke @ zone.js:322Zone.run @ zone.js:216(anonymous function) @ zone.js:571ZoneDelegate.invokeTask @ zone.js:356NgZoneImpl.inner.inner.fork.onInvokeTask @ core.umd.js:6066ZoneDelegate.invokeTask @ zone.js:355Zone.runTask @ zone.js:256drainMicroTaskQueue @ zone.js:474ZoneTask.invoke @ zone.js:426 platform-browser.umd.js:971EXCEPTION: Error: Uncaught (in promise): TypeError: Cannot read property 'query' of null platform-browser.umd.js:962EXCEPTION: Error: Uncaught (in promise): TypeError: Cannot read property 'query' of nullBrowserDomAdapter.logError @ platform-browser.umd.js:962BrowserDomAdapter.logGroup @ platform-browser.umd.js:972ExceptionHandler.call @ core.umd.js:3696(anonymous function) @ core.umd.js:8951schedulerFn @ core.umd.js:6007SafeSubscriber.__tryOrUnsub @ Subscriber.ts:240SafeSubscriber.next @ Subscriber.ts:192Subscriber._next @ Subscriber.ts:133Subscriber.next @ Subscriber.ts:93Subject._finalNext @ Subject.ts:154Subject._next @ Subject.ts:144Subject.next @ Subject.ts:90EventEmitter.emit @ core.umd.js:5996NgZone._zoneImpl.NgZoneImpl.onError @ core.umd.js:6227NgZoneImpl.inner.inner.fork.onHandleError @ core.umd.js:6096ZoneDelegate.handleError @ zone.js:327Zone.runGuarded @ zone.js:233_loop_1 @ zone.js:487drainMicroTaskQueue @ zone.js:494ZoneTask.invoke @ zone.js:426 platform-browser.umd.js:962STACKTRACE:BrowserDomAdapter.logError @ platform-browser.umd.js:962ExceptionHandler.call @ core.umd.js:3698(anonymous function) @ core.umd.js:8951schedulerFn @ core.umd.js:6007SafeSubscriber.__tryOrUnsub @ Subscriber.ts:240SafeSubscriber.next @ Subscriber.ts:192Subscriber._next @ Subscriber.ts:133Subscriber.next @ Subscriber.ts:93Subject._finalNext @ Subject.ts:154Subject._next @ Subject.ts:144Subject.next @ Subject.ts:90EventEmitter.emit @ core.umd.js:5996NgZone._zoneImpl.NgZoneImpl.onError @ core.umd.js:6227NgZoneImpl.inner.inner.fork.onHandleError @ core.umd.js:6096ZoneDelegate.handleError @ zone.js:327Zone.runGuarded @ zone.js:233_loop_1 @ zone.js:487drainMicroTaskQueue @ zone.js:494ZoneTask.invoke @ zone.js:426 platform-browser.umd.js:962Error: Uncaught (in promise): TypeError: Cannot read property 'query' of null at resolvePromise (zone.js:538) at PromiseCompleter.reject (zone.js:515) at eval (core.umd.js:8981) at ZoneDelegate.invoke (zone.js:323) at Object.NgZoneImpl.inner.inner.fork.onInvoke (core.umd.js:6075) at ZoneDelegate.invoke (zone.js:322) at Zone.run (zone.js:216) at zone.js:571 at ZoneDelegate.invokeTask (zone.js:356) at Object.NgZoneImpl.inner.inner.fork.onInvokeTask (core.umd.js:6066)BrowserDomAdapter.logError @ platform-browser.umd.js:962ExceptionHandler.call @ core.umd.js:3699(anonymous function) @ core.umd.js:8951schedulerFn @ core.umd.js:6007SafeSubscriber.__tryOrUnsub @ Subscriber.ts:240SafeSubscriber.next @ Subscriber.ts:192Subscriber._next @ Subscriber.ts:133Subscriber.next @ Subscriber.ts:93Subject._finalNext @ Subject.ts:154Subject._next @ Subject.ts:144Subject.next @ Subject.ts:90EventEmitter.emit @ core.umd.js:5996NgZone._zoneImpl.NgZoneImpl.onError @ core.umd.js:6227NgZoneImpl.inner.inner.fork.onHandleError @ core.umd.js:6096ZoneDelegate.handleError @ zone.js:327Zone.runGuarded @ zone.js:233_loop_1 @ zone.js:487drainMicroTaskQueue @ zone.js:494ZoneTask.invoke @ zone.js:426 zone.js:461 Unhandled Promise rejection: Cannot read property 'query' of null ; Zone: angular ; Task: Promise.then ; Value: TypeError: Cannot read property 'query' of null(…)consoleError @ zone.js:461_loop_1 @ zone.js:490drainMicroTaskQueue @ zone.js:494ZoneTask.invoke @ zone.js:426 zone.js:463 Error: Uncaught (in promise): TypeError: Cannot read property 'query' of null(…)consoleError @ zone.js:463_loop_1 @ zone.js:490drainMicroTaskQueue @ zone.js:494ZoneTask.invoke @ zone.js:426
,但小的變化,它的開始工作:
./todo-input.ts
import {Component} from "@angular/core";
import {TodoService} from "./todo-service";
@Component({
selector: 'todo-input',
template: `<div>
I'm a todo input
<input type="text" #myInput>
<button (mouseover)="onClick($event, myInput.value)">Click me</button>
</div>`
})
export class TodoInput{
constructor() {
console.log(TodoService);
}
onClick(event, value) {
console.log(event, value);
}
}
和我在控制檯中有正常的對象(沒有任何錯誤)
SystemJS配置
<script>
(function(global) {
// map tells the System loader where to look for things
var map = {
'app': 'app', // 'dist',
'@angular': '@angular',
'angular2-in-memory-web-api': 'angular2-in-memory-web-api',
'rxjs': 'rxjs'
};
// packages tells the System loader how to load when no filename and/or no extension
var packages = {
'app': { main: 'main.js', defaultExtension: 'js' },
'rxjs': { defaultExtension: 'js' },
'angular2-in-memory-web-api': { main: 'index.js', defaultExtension: 'js' },
};
var ngPackageNames = [
'common',
'compiler',
'core',
'http',
'platform-browser',
'platform-browser-dynamic',
'router',
'router-deprecated',
'upgrade',
];
// Individual files (~300 requests):
function packIndex(pkgName) {
packages['@angular/'+pkgName] = { main: 'index.js', defaultExtension: 'js' };
}
// Bundled (~40 requests):
function packUmd(pkgName) {
packages['@angular/'+pkgName] = { main: pkgName + '.umd.js', defaultExtension: 'js' };
};
// Most environments should use UMD; some (Karma) need the individual index files
var setPackageConfig = System.packageWithIndex ? packIndex : packUmd;
// Add package entries for angular packages
ngPackageNames.forEach(setPackageConfig);
var config = {
baseURL: '{!! url('public/admin/js') !!}',
map: map,
packages: packages
}
System.config(config);
})(this);
System.import('app').catch(function(err){ console.error(err); });
</script>
所以我的問題是:爲什麼,因爲它在本教程的完成我不能叫從構造函數的參數是服務?或者如何做到這一點?我錯過了什麼嗎?教程看起來非常棒,可以給我非常好的Angular2基礎知識,但是當你陷入這樣簡單的事情時,它很難學習。
非常感謝! 湯姆
它應該工作(定義注入的構造函數參數)。你只使用TypeScript或ES6? –
我的** tsconfig。JSON **: '{ 「compilerOptions」:{ 「目標」: 「ES5」, 「模塊」: 「CommonJS的」, 「moduleResolution」: 「節點」, 「sourceMap」:真, 「 emitDecoratorMetadata 「:真實, 」experimentalDecorators「:真實, 」removeComments「:假的, 」noImplicitAny「:假的, 」OUTDIR「:」 ./public/admin/js/app/」 }, 「filesGlob」 :[ 「./**/*.ts」, 「!node_modules/**/*。ts」 ] }' – MrTomAsh
您的SystemJS配置也可以幫助... –