Angular 5 HttpClient返回undefined到订阅函数,不能更改变量

时间:2018-01-24 12:37:48

标签: angular http httpclient angular5

我需要向用户显示一条消息,以便他知道他的电子邮件已存在于我们的数据库中。我有这个方法:

addPartners(partnerName, showMsg)
{
    showMsg = false;
    const headerOptions = new HttpHeaders().set('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
    const body = new HttpParams().set('name', partnerName);
    return this.http.post('http://aff.local/addPartner.php', body, {
          headers: headerOptions
}).pipe(map(
    res=>{

      //console.log(res)
      if(res==null)
      {
        //alert("Your email already exist in our database");
        showMsg = true;
      }
      else{
        showMsg=false;
      }
    },
    error=>{
      console.log("Error: "+ error);
    }
  ))
 }

我在点击时在我的组件中运行它:

addPartner(){
    this.email = this.subscribeForm.get('emailTxt').value;
    console.log("hi "+this.email);
    this.api.addPartners(this.email, this.showMsg).subscribe(
      (data)=>{
        console.log(this.showMsg);

        this.subscribeForm.reset();
      },
      (error)=>{
        console.log(error)
      }
    );
  }

showMsg为真的DOM中,我将显示消息:

<div class="container" *ngIf="showMsg">
   ...
</div>

我的问题是我总是在console.log(this.showMsg)undefined的控制台上作为返回值。这就是为什么showMsg总是假的,即使电子邮件已经存在,我应该向用户显示一条消息。

我试图在控制台上看到data值:

console.log(data);

我仍然在控制台获得undefined

我想要的是,当我已经在我的数据库中有电子邮件时,将值更改为true。这是我的PHP脚本,以了解更多:

public function addPartner($partner_name){
        global $conn;
        //$existingValueMsg = "Email already exists";
        $existingValue = "SELECT * FROM partner WHERE partner_name=:partner_name";
        $execExistingValue=$conn->prepare($existingValue);
        $execExistingValue->bindValue(":partner_name", $partner_name);
        $execExistingValue->execute();
        $execExistingValue->fetchAll();
        $resultNumber = $execExistingValue->rowCount();
        if($resultNumber==0)
        {
            $addParner = "INSERT INTO partner(partner_name, image) VALUES(:partner_name, '')";
            $execAddPartner = $conn->prepare($addParner);
            $execAddPartner->bindValue(":partner_name", $partner_name);
            $execAddPartner->execute();

            return true;
        }
        else
        {
            //return $existingValueMsg;
            return false;
        }
    }

如果为false,则在typescript方法中返回的值为null

2 个答案:

答案 0 :(得分:1)

JavaScript是按值传递的。

function increment(i: number) {
  i++;
}

let i  = 0; 
increment(i); 
console.log(i);` 

这将始终打印0.因为i副本传递给increment()

使用map() rxjs运算符将发出的事件转换为true或false。然后,如果您从您的组件订阅,您收到的事件将是真实的或错误的,您可以采取相应的行动。

答案 1 :(得分:1)

您无需将showMsg传递给您的服务。您的服务中不会更新showMsg值,因为javascript是按值传递的,如@JB Nizet所述。

因此,您应该做的是在您的服务中返回布尔结果,在您的组件中订阅它,然后将其分配给showMsg - this.showMsg = data

可以在此处找到演示代码:https://stackblitz.com/edit/angular-bhyab1。 请参阅app componentpartner service