我需要向用户显示一条消息,以便他知道他的电子邮件已存在于我们的数据库中。我有这个方法:
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
。
答案 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 component
和partner service
。