2016-04-29 47 views
1

我有一个角度2应用程序,我今天从beta1升级到beta16。它的工作原理罚款β1,但不能在16我得到这个错误:EXCEPTION:TypeError:在升级后无法读取undefined属性'subscribe'

angular2.dev.js:24821 TypeError: Cannot read property 'subscribe' of undefined 
    at AppView._View_ApplicationForm0.createInternal (ApplicationForm.template.js:825) 
    at AppView.create (angular2.dev.js:22641) 
    at AppView._View_Home5.createInternal (Home.template.js:509) 
    at AppView.create (angular2.dev.js:22641) 
    at TemplateRef_.createEmbeddedView (angular2.dev.js:4186) 
    at ViewContainerRef_.createEmbeddedView (angular2.dev.js:5742) 
    at NgIf.Object.defineProperty.set [as ngIf] (angular2.dev.js:10003) 
    at AppView._View_Home0.detectChangesInternal (Home.template.js:848) 
    at AppView.detectChanges (angular2.dev.js:22811) 

我有是工作得很好plnkr一个例子,但是这并不在我的地方工作。只适用于beta1。这里是我的plnkr:

http://plnkr.co/edit/eZJYOVsvFeglfJmuIHpp?p=preview

app.ts

import {Component} from 'angular2/core' 
import {Form} from 'src/frm' 
@Component({ 
    selector: 'my-app', 
    providers: [], 
    template: ` 
    <div> 
     <frm (submitted) = "submitted()"></frm> 
    </div> 
    `, 
    directives: [Form] 
}) 
export class App { 
    constructor() { 
    this.name = 'Angular2' 
    } 

    submitted(){ 
    console.log('clicked'); 
    } 
} 

frm.ts

import {Component, EventEmitter} from 'angular2/core' 

@Component({ 
    selector: 'frm', 
    providers: [], 
    template: ` 
    <div> 
     <h2>Form</h2> 
     <button (click) = "clicked()">Go</button> 
    </div> 
    `, 
    directives: [], 
    outputs: ['submitted', 'canceled'] 
}) 
export class Form { 

    submitted: EventEmitter<any> = new EventEmitter<any>(); 

    canceled: EventEmitter<any> = new EventEmitter<any>(); 

    constructor() { 

    } 

    clicked(){ 
    this.submitted.emit(null); 

    } 
} 

如果我删除了事件绑定,它会工作。就像这样:

<frm></frm> 

这里是我的package.json:

{ 
    "name": "angular2-quickstart", 
    "version": "1.0.0", 
    "scripts": { 
    "postinstall": "npm run typings install", 
    "tsc": "tsc", 
    "tsc:w": "tsc -w", 
    "lite": "lite-server", 
    "start": "concurrent \"npm run tsc:w\" \"npm run lite\" ", 
    "typings": "typings" 
    }, 
    "license": "ISC", 
    "dependencies": { 
    "angular": "~1.5.0", 
    "angular-animate": "~1.5.0", 
    "angular-aria": "~1.5.0", 
    "angular-material": "~1.0.5", 
    "angular-ui-bootstrap": "~1.1.2", 
    "angular2": "2.0.0-beta.16", 
    "es6-promise": "^3.0.2", 
    "es6-shim": "^0.35.0", 
    "jquery": "~2.2.0", 
    "ng2-bootstrap": "~1.0.3", 
    "reflect-metadata": "0.1.2", 
    "rxjs": "5.0.0-beta.2", 
    "systemjs": "0.19.26", 
    "zone.js": "0.6.12" 
    }, 
    "devDependencies": { 
    "concurrently": "^2.0.0", 
    "lite-server": "^2.2.0", 
    "typescript": "^1.8.10", 
    "typings": "^0.8.1" 
    } 
} 
+0

现在有beta.17。此外,也许你应该更新你的其他依赖关系。 – acdcjunior

+0

不能更新为17,因为ng2-bootstrap仍然不在17中。我不期待17会解决这个问题。 –

回答

0

问题是我缺少implements关键字。

+0

你怎么解决这个问题? –

+0

正如我所提到的,我错过了我的组件上的implements关键字来实现一个类。我加了这个,它工作。 –

1

似乎有一对夫妇的错误在你的app.js文件:

(1)声明name变量在在访问它之前,类的顶部,如:name:string;

(2)导入应该是这样的:import {Form} from './frm'

+0

他们不是真正的错误。请记住,如果我删除了我的活动订阅,则一切正常 –

+0

以上提到的所有建议对我来说一切正常。我在beta 16上测试过。 – siva636

+0

我用Package.json文件更新了我的问题。如果我缺少升级内容,你是否介意检查这个匹配? –

3

我认为这个问题可能与你的输出实例有关。这里是做正确的方式(一个从你的工作pkunkr):

submitted: EventEmitter<any> = new EventEmitter<any>(); 

根据错误,Angular2不能在他们订阅,因为他们是不确定的。你确定他们在旅游本地代码中以相同的方式实例化吗?

+0

我的脑子一分钟后,这帮助了我。感谢您的快速,简洁的解释! –

相关问题