【问题标题】:How to access members of a service from HTML View?如何从 HTML 视图访问服务成员?
【发布时间】:2017-12-28 14:16:28
【问题描述】:

我正在学习 Angular 2,但不确定应该采用哪种方式来更新视图。

示例: 我有两个组件,用户和主。

User 组件从 UserService 获取用户列表。该组件正在从此服务中读取所有初始化用户,并将一个组件成员设置为用户列表。

如果另一个用户被选中,该组件只是将值 (id) 传递给 UserService,UserService 将用户对象存储在一个名为“selected”的成员中。 UserService 有一个方法 getSelected() 来返回选定的用户。

就其而言,它正在工作(顺便问一下,如何在 Type Script 中创建私有/公共成员/方法?)

现在我想在主组件中显示选择的用户。 如何显示它,选择的每次更新都通过服务委派并被主要组件捕获。

用户控制器中用于选择用户的示例代码

onChange(event) {

        this._userService.select(event.source.value);

    }

在用户服务中我这样存储:

select(userId: number) {
        for (const user of this.users) {
            if (user.getId() === userId) {
                this.selected = user;
            }
        }
    }

得到主要组件

getUser() {
        return this._userService.getCurrent();
    }

在 HTML 我试过这个

<div fxLayout="column" fxFlex fxLayoutAlign="center center">    
    <div>selected User: {{getUser()}}</div>
</div>

但它不起作用。 angular2/typescript 中最好的方法是什么?

我应该在我的 HTML 中直接访问该服务吗?您更喜欢/建议什么?

推荐, n00n

【问题讨论】:

  • 您的select 函数可能存在问题。它应该按照您的方式工作。试试这个示例:stackblitz.com/edit/angular-vfhmut
  • 你可以直接通过服务的object从HTML访问服务的变量,比如&lt;div&gt;selected User: {{ _userService.getCurrent() }}&lt;/div&gt;

标签: angular typescript


【解决方案1】:

有两种方法可以完成你的任务:

只需像这样在您的服务中创建一个主题变量:

public selectedUser$ = new Subject<User>();

当用户选择时,只需通过上面的 observable 发出一个值,如下所示:

onChange(event) {
  this._userService.selectedUser$.next(event.source.value);    
}

在您的第二个组件中,您需要订阅您的主题以获得如下价值:

this._userService.selectedUser$.subscribe(user => {
  console.log(user);
})

希望它会有所帮助。

【讨论】:

  • 第二种方式是通过输入进行父子通信。是您在父子关系中的两个组成部分。顺便说一句,第一种方法适用于每种情况。是否为父子关系
  • 这对我来说是全新的。 this.service.selectedUser$.next(user) 中的 $ 是什么?为了?
  • $ in variable at last position 表示该变量是可观察的。为了您的方便,我更新了我的答案。
猜你喜欢
  • 2015-08-26
  • 2016-04-04
  • 1970-01-01
  • 2013-04-16
  • 2010-11-06
  • 1970-01-01
  • 2015-02-19
  • 2021-05-24
  • 1970-01-01
相关资源
最近更新 更多