2

我已经在我的service.ts 中定义了主题onEditItem()indetail.component.ts传递了 id in 的值,.next()并且在new.component.ts中订阅了主题 但是订阅不起作用。订阅ngOnInitnew.component.ts中完成

id 的值传入成功,onEditItem()但是订阅不起作用。我试过在订阅中进行 console.log 检查。但是控制台中没有打印任何内容。

details.component.html

<a class="btn btn-primary" (click)="onEditItem()" routerLink="/new">Edit</a>

details.component.ts

  onEditItem(){this.contactService.startedEditing.next(this.id);}

contactService.ts

export class ContactService {
  startedEditing =new Subject<number>();
}

new.component.ts

ngOnInit() {
  this.subscription = this.contactService.startedEditing.subscribe(
    (index: number) => {
      console.log(index);

      this.editedItemIndex = index;
      console.log(this.editedItemIndex);
      this.editMode = true;
      this.editedItem = this.contactService.getContacts(index);

      this.editForm.setValue({
        name: this.editedItem.name,
        address: this.editedItem.address
      })
    }
  );
} 

我希望在中定义的表单new.component.html应该使用详细信息组件中的值进行初始化,但订阅在ngOnInit.

4

3 回答 3

5

主体需要发出值,以便观察者对事件采取行动。

这意味着您必须单击 Div 或切换到 a BehaviorSubject,这将返回订阅时流的最后一个值。

于 2019-05-27T07:15:49.937 回答
0

该主题是可观察者和观察者的混合版本。因此它将显示两种行为,并且没有必要创建单独的 observable。

我为您的问题创建了一个简单的 stackbitz。请检查(https://stackblitz.com/edit/angular-ypeadt)希望这会有所帮助。干杯!

于 2019-05-27T07:53:29.967 回答
0

你必须改变你的服务

startedEditing =new Subject<number>();
startedEditing$: Observable<any> = this.startedEditing.asObservable();

 shareData(data)
  {
    this.startedEditing.next(data)
  }

在你的details.component.ts

 onEditItem(){
  this.contactService.shareData(this.id)
  }

最后在new.component.ts

ngOnInit() {
  this.contactService.startedEditing$.subscribe(res=>{ 
 console.log(res)// you can get the data here
}

就是这样

于 2019-05-27T07:18:13.007 回答