2016-11-04 4 views
1

저는 2 번 각도입니다. 저는 2 개의 compnents를 가지고 있는데 하나는 텍스트 필드가있는 searchcomponent이고 다른 하나는 displayComponent입니다. 입력 필드에서 일부 값을 입력 한 후 enter 키를 눌러 eventemitter 서비스 (@input 및 @output과 함께 사용하지 않음)를 사용하여 displaycomponent에 표시해야합니다. 이미지 점검 image1image2Emitter 서비스 angular2에서 subscribe를 사용하여 ts 파일에서 데이터를 다시 검색하지만 html로 데이터를 표시하지 않습니다.

코드는 searchComponent.html

<div>Search and clear</div> 
<input type="text" value="{{inputTerm}}" (keyup.enter)="alertInput(input1.value)" #input1/> 

searchComponent.ts

emitter.service.ts

import {EventEmitter, Injectable} from '@angular/core'; 


@Injectable() 
export class EmitterService { 
    private static _emitters: { [channel: string]: EventEmitter<any> } = {}; 
    static get(channel: string): EventEmitter<any> { 
    if (!this._emitters[channel]) 
     this._emitters[channel] = new EventEmitter(); 
    return this._emitters[channel]; 
    } 
} 

입니다

import {Component} from '@angular/core'; 
import {EmitterService} from '../emitter.service'; 


@Component({ 
    selector: 'search', 
    templateUrl: './Task1-search.html' 
}) 
export class SearchComponent { 

    inputTerm:string; 
    menubarEmitter = EmitterService.get("displayText"); 

    alertInput(val1){ 
     this.inputTerm=val1 
     alert("user clicked enter to see input value is "+this.inputTerm); 
     this.menubarEmitter.emit({"InputText":this.inputTerm}); 
    }  
} 
,363,210

displaycomponent.html

<div>The name entered in input field is {{displayValue}}</div> 

dispalycomponent.ts

import {Component} from '@angular/core'; 
import {EmitterService} from '../emitter.service'; 

@Component({ 
    selector: 'display', 
    templateUrl: './Display-input.html', 

}) 
export class DisplayComponent { 

    displayValue:string; 
    menubarEmitter = EmitterService.get("displayText"); 

    constructor(){ 
    this.menubarEmitter.map((res:any)=>res).subscribe(val => { 
     if(val.InputText==undefined || val.InputText==""){ 
     // this.displayValue=val.InputText; 
     console.log("wrong"); 
     } 
     else{ 
     console.log("right"); 
     this.displayValue=val.InputText; 

     } 
     console.log("display "+this.displayValue); 
    }); 
    } 
} 

package.json

{ 
    "name": "angular2-seed", 
    "version": "1.0.0", 
    "description": "A simple starter Angular2 project", 
    "scripts": { 
    "build": "webpack --inline --colors --progress --display-error-details --display-cached", 
    "watch": "npm run build -- --watch", 
    "server": "webpack-dev-server --inline --colors --progress --display-error-details --display-cached --port 3000 --content-base src", 
    "start": "npm run server" 
    }, 
    "contributors": [ 
    "Rob Wormald <[email protected]>", 
    "PatrickJS <[email protected]>" 
    ], 
    "license": "MIT", 
    "devDependencies": { 
    "@types/core-js": "^0.9.32", 
    "@types/node": "^6.0.38", 
    "angular2-template-loader": "^0.4.0", 
    "awesome-typescript-loader": "^1.1.1", 
    "css-loader": "^0.23.1", 
    "raw-loader": "^0.5.1", 
    "to-string-loader": "^1.1.4", 
    "typescript": "^2.0.2", 
    "webpack": "^1.12.9", 
    "webpack-dev-server": "^1.14.0", 
    "webpack-merge": "^0.8.4" 
    }, 
    "dependencies": { 
    "@angular/common": "2.0.0", 
    "@angular/compiler": "2.0.0", 
    "@angular/core": "2.0.0", 
    "@angular/forms": "2.0.0", 
    "@angular/http": "2.0.0", 
    "@angular/platform-browser": "2.0.0", 
    "@angular/platform-browser-dynamic": "2.0.0", 
    "@angular/platform-server": "2.0.0", 
    "@angular/router": "3.0.0", 
    "@angular/upgrade": "2.0.0", 
    "core-js": "^2.4.1", 
    "ie-shim": "^0.1.0", 
    "reflect-metadata": "^0.1.3", 
    "rxjs": "5.0.0-beta.12", 
    "zone.js": "~0.6.23", 
    "angular2-in-memory-web-api": "0.0.20", 
    "bootstrap": "^3.3.7" 
    }, 
    "keywords": [ 
    "Angular2", 
    "angular2-seed", 
    "official angular 2 seed", 
    "official angular2 seed" 
    ], 
    "repository": { 
    "type": "git", 
    "url": "git+https://github.com/angular/angular2-seed.git" 
    }, 
    "bugs": { 
    "url": "https://github.com/angular/angular2-seed/issues" 
    }, 
    "homepage": "https://github.com/angular/angular2-seed#readme" 
} 

app.module.ts

import {NgModule} from '@angular/core' 
import {RouterModule} from "@angular/router"; 
import {rootRouterConfig} from "./app.routes"; 
import {AppComponent} from "./app.component"; 
import {GithubService} from "./github/shared/github.service"; 
import {FormsModule} from "@angular/forms"; 
import {BrowserModule} from "@angular/platform-browser"; 
import {HttpModule} from "@angular/http"; 
import {AboutComponent} from './about/about.component'; 
import {HomeComponent} from './home/home.component'; 
import {RepoBrowserComponent} from './github/repo-browser/repo-browser.component'; 
import {RepoListComponent} from './github/repo-list/repo-list.component'; 
import {RepoDetailComponent} from './github/repo-detail/repo-detail.component'; 
import {LocationStrategy, HashLocationStrategy} from '@angular/common'; 
import {EventEmitter, Injectable} from '@angular/core'; 

import {SearchComponent} from "./Task1-search/Task1-search"; 
import {DisplayComponent} from "./Display-input/Display-input"; 
import {EmitterService} from "./emitter.service"; 

@NgModule({ 
    declarations: [AppComponent, AboutComponent, RepoBrowserComponent, RepoListComponent, RepoDetailComponent, HomeComponent, SearchComponent, DisplayComponent], 
    imports  : [BrowserModule, FormsModule, HttpModule, RouterModule.forRoot(rootRouterConfig)], 
    providers : [GithubService, {provide: LocationStrategy, useClass: HashLocationStrategy}, EmitterService], 
    bootstrap : [AppComponent] 
}) 
export class AppModule { 

} 

AP p.component.ts

import {Component} '@ angular/core'에서 가져 오기;

@Component({ 
    selector : 'app', 
    templateUrl: './app.component.html', 
}) 
export class AppComponent { 
} 

app.component.html

<h3> 
    Angular 2 Seed 
</h3> 
<nav> 
    <!--<a [routerLink]="['/']"> 
    Home 
    </a> 
    | 
    <a [routerLink]="['/about']"> 
    About 
    </a>--> 
    | 
    <a [routerLink]="['/search']"> 
    Search 
    </a> 
    | 
    <a [routerLink]="['/display']"> 
    Display 
    </a> 
    | 
    <!--<a [routerLink]="['/github', 'angular']"> 
    Github Repos 
    </a>--> 
</nav> 

<main> 
    <router-outlet></router-outlet> 
</main> 


<footer> 
    © 2016 
</footer> 

사람은 이러한 문제를 해결하기 위해 도와주세요 수 있습니다. 고맙습니다.

+1

당신이 AppComponent 코드를 추가 할 수보십시오? 그건 그렇고, 당신이 달성하고자하는 것을 정확히 이해한다면, 1) DependencyInjection을 사용하지 않는다. 2) componets @Output() 프로퍼티에서만 사용되어야하는 EventEmitter 대신 Subject (또는 다른 관찰 가능 객체)를 사용해야한다. 3) AppModule (또는 가지고있는 모듈)을 사용하여 종속성 주입 구성 – Picci

+0

@Picci app.module 및 app.componet 파일을 추가했습니다. 한번 확인하십시오. – NunnaS

+0

생성자 메소드에있는 코드를 이동하십시오. DisplayComponent를 새 메서드 ngOnInit()에 추가합니다. 어쨌든 정적 변수를 사용하고 Dependency Injection을 사용하지 않는다는 것을 알고 있습니까? – Picci

답변

1

ChangeDetectorRef이

constructor(private changeDetectorRef: ChangeDetectorRef) { 
    this.menubarEmitter.map((res:any)=>res).subscribe(val => { 
    if(val.InputText==undefined || val.InputText=="") { 
     console.log("wrong"); 
    } else { 
     console.log("right"); 
     this.displayValue=val.InputText; 
     this.changeDetectorRef.detectChanges(); 
    } 
    console.log("display "+this.displayValue); 
    }); 
} 
+0

Thanks @ Eswar하지만 문제가 해결되지 않았습니다. 이전 출력과 동일 데이터가 표시되지 않음 – NunnaS

+1

EmitterService를 생성자에 추가 한 다음 확인 – Eswar