2017-02-21 25 views
3

Итак, у меня есть два компонента в Angular2. Когда пользователь нажимает кнопку в компоненте 1, у меня есть метод, который хранит данные в sharedservice для переменной. Эта переменная доступна в компоненте2 ngOnInit(). Однако переменная в инициализированной до неопределенной в ngOnInit(), потому что она не ждет события click.Как подождать событие щелчка пользователя в angular2?

В целом, как я могу заставить angular2 component2 ждать события click в компоненте1?

В JavaScript мы можем легко сделать это с помощью прослушивателя событий щелчка или иметь функцию обратного вызова, но я не знаю, как реализовать ту же идею в угловом режиме.

Не могли бы вы поделиться своими идеями.

Это то, что я до сих пор:

modules.component.html

<tr *ngFor="let module of modules" #moduleObject> 
    <a class="test" (click)="module._clicked = !module._clicked"></a> 
    <ul class="dropdown-menu" role="menu" [ngStyle]="{'display': module._clicked ? 'block' : 'none'}" > 
    <li><a (click)="_showDialogue =! _showDialogue; _getModuleCode(module)"><img src="../../assets/img/pencil.svg" alt="" width="13px">Edit Module</a></li> 

    </ul> 
</tr> 

Я удалим ненужный код из modules.component.ts, как это будет просто удар все здесь modules.component.ts

import {SharedService} from "../shared/shared.service"; 
import {DepartmentsService} from "./departments.service"; 
import {ActivatedRoute, Params} from "@angular/router"; 
import {Module} from "../dashboard/Module"; 

@Component({ 
    selector: 'app-modules', 
    templateUrl: './modules.component.html', 
    providers: [DepartmentsService] 
}) 
export class ModulesComponent implements OnInit { 
    service; 

    modules: Module[]; 

    constructor(
    private activatedRoute: ActivatedRoute, 
    service : SharedService, 
    private departmentsService: DepartmentsService, 
    route: ActivatedRoute) { 
    route.params.subscribe(p => {this.department = p['dname']; }); 
    this.service = service; 
    } 

    _getModuleCode(moduleObject) { 
    this.departmentsService.moduleObject = moduleObject; 
    } 


    ngOnInit() { } 
} 

departments.service.ts

// assume necessary imports above 
@Injectable() 
export class DepartmentsService { 
    public _facultyName  :string; 
    public _departmentName :string; 
    public moduleObject:Module; 
    constructor() {} 
} 

Тогда я называю переменной moduleObject из этого компонента: edit-forms.component.html

import {Module} from "./Module"; 
import {DepartmentsService} from "../components/departments.service"; 
//Change 
@Component({ 
    selector: 'enable-module-form', 
    templateUrl: './edit-forms.component.html', 
    providers:[ModuleService] 
}) 
export class EnableModFormComponent { 
    constructor( 
    private moduleService: ModuleService, 
    private departmentService: DepartmentsService 
) { } 

    ngOnInit(){ 
    console.log(this.departmentService.moduleObject); 
    } 

} 
+0

Вы должны использовать «Наблюдаемый». Можете ли вы опубликовать код вашего сценария, чтобы мы могли предоставить вам более реалистичный ответ? – acdcjunior

+0

уверенный вещь. Пожалуйста, проверьте мои последние изменения выше @acdcjunior – DingDong

+0

какой-нибудь удачи? @acdcjunior – DingDong

ответ

2

Это должно работать!

DepartmentService:

private moduleSource = new Subject<any>(); 
moduleValue = this.moduleSource.asObservable(); 

moduleValueReceived(module) { 
    //emit value 
    this.moduleSource.next(module) 
} 

и в ваших родителей, когда у вас есть значение, установленное значение в службе:

_getModuleCode(moduleObject) { 
    this.departmentsService.moduleValueReceived(moduleObject); 
} 

и вашего ребенка конструктор, подписываться на значение:

constructor( 
    private moduleService: ModuleService, 
    private departmentService: DepartmentsService 
) { 
    moduleService.moduleValue.subscribe(moduleObject => { 
     console.log(moduleObject); // here you have your value 
    }) 
    } 

Here in the official docs У вас есть эквивалентный пример с дальнейшим объяснением чем я предоставил.

Надеюсь, это поможет!

+0

А еще раз спасибо. Не знаю, что я буду делать без тебя. Действительно ценю это. Хотя это и сработало. Но по какой-то причине 'subscribe (i => i.console.log (i))' многократно печатает кликнутый элемент. Почему это? Я просто хочу, чтобы он возвращал элемент с щелчком один раз. – DingDong

+0

Поскольку у меня есть список кнопок, и когда я нажимаю кнопку, я получаю нужные данные, но возвращает данные в соответствии с количеством кнопок в 'ul li' У меня есть – DingDong

+0

Ну, если он печатается несколько раз, это будет что изменения происходят несколько раз, так как подписка естественным образом подписывается при каждом изменении :) Я не вижу никаких кнопок в вашем коде, который вы предоставили? Не могли бы вы подробнее остановиться? Все остальное код кажется мне совершенно понятным, что происходит, но, может быть, еще немного показать html, если у вас действительно есть кнопки? Поэтому я бы лучше понял, что происходит в представлении :) – Alex