Angular 7:从服务发送响应消息

时间:2019-01-16 09:11:09

标签: javascript html angular http service

我从Angular项目中的服务文件发出请求:

signIn(username: string, password: string): Observable<any> {

    const formData = ...
        this.http.post(`${this.uri}`, formData, httpOptions)
          .subscribe(res => console.log(        
              if (statusCode === '0') {
                this.message = 'test';

              } else {
                this.message2 = 'test2';
              }
            })));
        return;
      }

此功能效果很好。但是我无法在HTML中拍摄message。当我在HTML中键入{{message}}时,它是未定义的。 我声明了message: String;,但是它不起作用。 我猜服务是私有的,这个问题就是这样。

如何显示HTML中的回复?最好的方法是什么?

更新:这是我的组件:

message: String;

signIn(username, password): Observable<any> {

    this.cookieService.deleteAll();

    this.ls.signIn(username, password).subscribe(res =>
      xml2js.parseString(res, function (err, result) {
        const statusCode = ...
        console.log(statusCode); // it getting statusCode
        if (statusCode === '0') {
          this.message = 'test'; //Potentially invalid reference access to a class field via 'this.' of a nested function
        } else {

        }
      }));
      return;
  }

3 个答案:

答案 0 :(得分:0)

我想您的示例代码是服务类的一部分:您无法从HTML模板访问服务属性,例如message或message2。 您必须将可观察到的HTTP返回给控制器,并将订阅逻辑放入控制器。

服务:

return this.http.post(`${this.uri}`, formData, httpOptions);

控制器:

消息:字符串;

signIn(用户名,密码):可观察的{

this.cookieService.deleteAll();

this.ls.signIn(username, password).subscribe(res =>
  const self = this;
  xml2js.parseString(res, function (err, result) {
    const statusCode = ...
    console.log(statusCode); // it getting statusCode
    if (statusCode === '0') {
      self.message = 'test'; 
    } else {

    }
  }));
  return;

}

答案 1 :(得分:0)

您无法访问服务中的组件字段。您需要以某种方式传递服务响应,然后只有您可以使用该响应,并基于为消息分配的值并在html中显示。

我认为您应该使用回调函数,其中将包装http请求的响应,并将其用于服务的外部层。

signIn(username: string, password: string, data:any) {
    const formData = ...
    this.http.post(`${this.uri}`, formData, httpOptions)
        .subscribe(response => {
        data(response);
    }, error => data(// do something here);
}

现在将其用作此类(在我认为的组件中):

message: String;

this.restService.signIn(userName, password, response => {
    if(response && response.hasOwnProperty('statusCode')) {
        if (response['statusCode'] === '0') {
           this.message = 'test';    
        } else {
           this.message = 'test2';
        }
    }
});

现在您可以使用HTML中的消息

{{message}}

注意

您应始终仅将服务层用于数据传输(如果它是re​​st / api服务),则应在某些中间服务或组件级别使用业务逻辑或数据操作。

通过这种方式,您可以提供通用的rest服务并在整个应用程序中使用,您只需要传递请求主体,url和响应回调对象即可。

如果要在服务中编写逻辑,则必须为每个api调用编写单独的服务。

答案 2 :(得分:0)

角度模板仅在我们在其中声明的组件中搜索变量。模板中的更改如下所示

<p> {{service.message}} </p>

service注入到组件中。

如果在服务中声明message:string很好,则默认情况下变量是公共的,我们可以在模板中访问它们。但是借助服务变量,我们通过构造函数将它们注入。

我希望这能解决您的问题:)