在Angular10,在地图上拖动标记,把它的位置放在模型里面,jQuery看不到模型:我的代码
In Angular 10, drag the marker on the map, put its location inside the model, jQuery does not see the model: my code
在 Angular 10 和 TypeScript 中,我想拖动地图上的标记以将地图上带有 jQuery 的位置发送到一个方法,在输出中我得到地址和职位的标题和我已经定义的模型中,我把它和 double-sided 带有文本框的模型放在 HTML 中。但它在方法内部不识别模型并取值,但在方法外部它取一个未知值。请帮我。谢谢。
Html code
<pre>
<div class="dialog">
<div class="modal-header">
<button type="button" class="close" aria-label="Close" (click)="activeModal.dismiss()">
<span aria-hidden="true">×</span>
</button>
<h4 class="modal-title" id="modal-basic-title">address form</h4>
</div>
<div class="modal-body">
<div class="card-body map-wrapper">
<div class="row">
<div class="col-md-12 input-group map-search">
<input id="sourceLocation" #sourceLocation="ngModel" (input)="searchLocations()" name="searchTerm" type="search" [(ngModel)]="searchTerm" class="form-control" placeholder=" {{searchTitle}}"/>
<div class="search-result" style="height: auto">
<ul *ngIf="searchResult!= undefined && searchResult!=null" class="list-group p-0 m-0">
<li class="list-group-item" *ngFor="let item of searchResult" (click)="setPlace(item)">
<div class="clearfix d-block text-right">
<h6 class="float-right m-0 text-primary">{{item.title? item.title: null}}</h6>
<h6 class="float-left m-0 text-success">{{item.region? item.region: null}}</h6>
</div>
<div class="clearfix d-block text-right text-muted">
<small>{{item.address? item.address:null}}</small>
</div>
</li>
</ul>
</div>
</div>
<div id="mapDetails" class="neshan-container"></div>
</div>
</div>
</div>
<div class="card-footer">
<form>
<div class="row form-group">
<div class="col-md-1">
<label class="label" for="text-input"> title</label></div>
<div class="col-md-4">
<input type="text"
#title="ngModel"
[(ngModel)]="showResult.title"
name="title"
class="form-control input-sm"
id="title"
maxlength="50" />
</div>
<div class="col-md-1">
<label class="label" for="text-input">position</label></div>
<div class="col-md-3">
<input type="text"
required
#lat="ngModel"
[(ngModel)]="showResult.lat"
name="lat"
class="form-control input-sm"
id="lat"
maxlength="50" />
<span *ngIf="!lat.valid" class="errormessage">*</span>
</div>
<div class="col-md-3">
<input type="text"
required
#lng="ngModel"
[(ngModel)]="showResult.lng"
name="lng"
class="form-control input-sm"
id="lng"
maxlength="50" />
<span *ngIf="!lng.valid" class="errormessage">*</span>
</div>
</div>
<div class="row form-group">
<div class="col-md-1"><label class="label" for="text-input">address</label></div>
<div class="col-md-11">
<input type="text"
required
#address="ngModel"
[(ngModel)]="showResult.address"
name="address"
class="form-control input-sm"
id="address"
maxlength="150" />
<span *ngIf="!address.valid" class="errormessage">*</span>
</div>
</div>
<button class="k-button k-primary" [disabled]="!(lat.valid &lng.valid && address.valid)" (click)="setLocation()">accept</button>
<button class="k-button" (click)="activeModal.dismiss()">
<span aria-hidden="true">close</span>
</button>
</form>
</div>
</div>
</pre>
Ts code
public marker: any;
public mymap: any;
public lat: any
public lng: any
public showResultTemp: MapLocation=new MapLocation();
public showResultTemp1: MapLocation=new MapLocation();
public showResult: MapLocation=new MapLocation();
ngOnInit(): void {
this.showResult= new MapLocation();
this.showResultTemp=new MapLocation();
this.showResultTemp1=new MapLocation();
this.loadMap();
}
loadMap(): void {
if(this.mapData != null)
{
this.lat=this.mapData.Lat;
this.lng=this.mapData.Lng;
}
else
{
this.lat= 36.31329984170837;
this.lng= 59.56285528431181;
}
this.myMap = new L.Map('mapDetails', {
key: Helpers._webMapKey,
servicekey: Helpers._serviceMapKey,
maptype: 'dreamy',
timeoutReady: 0,
zoomControl: true,
center: [this.lat,this.lng],
searchPlaceholderText: "search",
zoom: 14,
activeMarker: true,
search: true,
poi: true,
traffic: true
});
this.myMap.setMapType("dreamy");
this.marker=null;
this.marker = new L.Marker([this.lat,this.lng],{draggable:true}).addTo(this.myMap);
this.marker.on('drag', this.searchOriginWithLatLng);
this.marker.on('dragend', this.searchOriginWithLatLng);
}
searchOriginWithLatLng(event)
{
this.showResultTemp= new MapLocation();
const queryUrl = `https://api.neshan.org/v2/reverse?&lat=${event.target._latlng.lat}& lng=${event.target._latlng.lng}`;
let headers = new HttpHeaders().set('Content-Type', 'text')
.append('Api-Key', Helpers._serviceMapKey);
const result = ajax({
method: 'GET',
url: queryUrl,
headers: {
'Api-Key': Helpers._serviceMapKey
}
});
result.subscribe((response:any) => {
this.changeMarkerDate = response.response;
this.showResultTemp.title=this.changeMarkerDate.route_name;
this.showResultTemp.address=this.changeMarkerDate.formatted_address;
this.showResultTemp.lat=this.lat;
this.showResultTemp.lng=this.lng;
this.showResult= this.showResultTemp;
});
}
ngAfterViewInit(): void {
this.showResult= new MapLocation();
this.marker1.on('dragend', this.searchOriginWithLatLngMarker1);
}
ngAfterContentInit(): void {
}
searchOriginWithLatLngMarker1(event)
{
this.showResultTemp= new MapLocation();
const queryUrl = `https://api.neshan.org/v2/reverse?&lat=${event.target._latlng.lat}&lng=${event.target._latlng.lng}`;
let headers = new HttpHeaders().set('Content-Type', 'text')
.append('Api-Key', Helpers._serviceMapKey);
const result = ajax({
method: 'GET',
url: queryUrl,
headers: {
'Api-Key': Helpers._serviceMapKey
}
});
result.subscribe((response:any) => {
this.changeMarkerDate = response.response;
this.showResultTemp.title=this.changeMarkerDate.route_name;
this.showResultTemp.address=this.changeMarkerDate.formatted_address;
this.showResultTemp.lat=event.target._latlng.lat;
this.showResultTemp.lng=event.target._latlng.lng;
this.showResult=this.showResultTemp;
this.showResult.address=this.showResult.address.replace("استان خراسان رضوی،","");
this.showResult.address=this.showResult.address.replace("مشهد،","");
this.showResult.address=this.showResult.address.trimStart();
this.showResult.address=this.showResult.address.trimEnd();
(document.getElementById("SrcRegion") as HTMLTextAreaElement).value=this.showResult.region;
(document.getElementById("SrcTitle") as HTMLTextAreaElement).value=this.showResult.title;
// document.getElementById('SrcAddress').setAttribute("value",this.showResult.address);
(document.getElementById("SrcAddress") as HTMLTextAreaElement).value=this.showResult.address;
(document.getElementById("SrcLat") as HTMLTextAreaElement).value=this.showResult.lat;
(document.getElementById("SrcLng") as HTMLTextAreaElement).value=this.showResult.lng;
event.target.bindPopup(this.showResult.title).openPopup();
const dstlat= (document.getElementById("DstLat") as HTMLTextAreaElement).value
const dstlng=(document.getElementById("DstLng") as HTMLTextAreaElement).value
// this.travelModel.SrcLat=this.showResult.lat;
// this.travelModel.SrcLng=this.showResult.lng;
if(dstlat != undefined && dstlat != null && dstlat!= ""
&& dstlng != undefined && dstlng != null && dstlng!= "")
{
this.parameterDirection={
type: "car",
origin: [this.showResult.lat,this.showResult.lng],
destination: [dstlat,dstlng],
avoidTrafficZone: true,
avoidOddEvenZone: true,
alternative: true,
};
const queryUrl2 = `https://api.neshan.org/v3/direction?type=${ this.parameterDirection.type}&origin=${ this.parameterDirection.origin}&destination=${ this.parameterDirection.destination}&avoidTrafficZone=${ this.parameterDirection.avoidTrafficZone}&avoidOddEvenZone=${ this.parameterDirection.avoidOddEvenZone}&alternative=${ this.parameterDirection.alternative}`;
//const queryUrl = `https://api.neshan.org/v1/search`;
let headers = new HttpHeaders().set('Content-Type', 'text')
.append('Api-Key', Helpers._serviceMapKey);
const result = ajax({
method: 'GET',
url: queryUrl2,
headers: {
'Api-Key': Helpers._serviceMapKey
}
});
result.subscribe((response:any) => {
this.resultDirections=response.response.routes;
this.resultDirection=this.resultDirections[0];
//this.travelModel.Distance=Math.round(this.resultDirection.legs[0].distance.value/1000);
const distance=Math.round(this.resultDirection.legs[0].distance.value/1000);
document.getElementById('lbldistance').innerHTML= this.resultDirection?.legs[0].distance.text;
document.getElementById('lbltime').innerHTML= this.resultDirection?.legs[0].duration.text;
// document.getElementById('Distance').setAttribute("value",distance.toString());
(document.getElementById("Distance") as HTMLTextAreaElement).value=distance.toString();
const dateObj = new Date(this.resultDirection.legs[0].duration.value * 1000);
// this.travelModel.TotalTime={hours:0,minutes:0};
const h=dateObj.getUTCHours();
const d=dateObj.getUTCMinutes();
// this.duration.minutes=dateObj.getUTCHours();
// this.duration.hours=dateObj.getUTCMinutes();
// this.travelModel.TotalTime.hours= h;
// this.travelModel.TotalTime.minutes= d;
// this.travelModel.FirstServicePrice=(this.station?.InputPrice +(this.station?.KMPrice* this.travelModel.Distance)+(this.station?.DelayPrice* ((h * 60) + d)));
const inputPrice=(document.getElementById("InputPrice") as HTMLTextAreaElement).value;
const kmPrice=(document.getElementById("KMPrice") as HTMLTextAreaElement).value;
const delayPrice=(document.getElementById("DelayPrice") as HTMLTextAreaElement).value;
//document.getElementById('FirstServicePrice').setAttribute("value",(+inputPrice +(+kmPrice * distance)+(+delayPrice * ((h * 60) + d))).toString());
const firstPrice=(+inputPrice +(+kmPrice * distance)+(+delayPrice * ((h * 60) + d)));
(document.getElementById("FirstServicePrice") as HTMLTextAreaElement).value=Helpers.roundNumber(firstPrice).toString();
let now = new Date();
let hours = ("0" + h).slice(-2);
let minutes = ("0" + d).slice(-2);
let str = hours + ':' + minutes;
this.durectiontime=str;
(document.getElementById("durectiontime") as HTMLTextAreaElement).value=this.durectiontime;
});
}
});
}
在 Angular 10 和 TypeScript 中,我想拖动地图上的标记以将地图上带有 jQuery 的位置发送到一个方法,在输出中我得到地址和职位的标题和我已经定义的模型中,我把它和 double-sided 带有文本框的模型放在 HTML 中。但它在方法内部不识别模型并取值,但在方法外部它取一个未知值。请帮我。谢谢。
Html code
<pre>
<div class="dialog">
<div class="modal-header">
<button type="button" class="close" aria-label="Close" (click)="activeModal.dismiss()">
<span aria-hidden="true">×</span>
</button>
<h4 class="modal-title" id="modal-basic-title">address form</h4>
</div>
<div class="modal-body">
<div class="card-body map-wrapper">
<div class="row">
<div class="col-md-12 input-group map-search">
<input id="sourceLocation" #sourceLocation="ngModel" (input)="searchLocations()" name="searchTerm" type="search" [(ngModel)]="searchTerm" class="form-control" placeholder=" {{searchTitle}}"/>
<div class="search-result" style="height: auto">
<ul *ngIf="searchResult!= undefined && searchResult!=null" class="list-group p-0 m-0">
<li class="list-group-item" *ngFor="let item of searchResult" (click)="setPlace(item)">
<div class="clearfix d-block text-right">
<h6 class="float-right m-0 text-primary">{{item.title? item.title: null}}</h6>
<h6 class="float-left m-0 text-success">{{item.region? item.region: null}}</h6>
</div>
<div class="clearfix d-block text-right text-muted">
<small>{{item.address? item.address:null}}</small>
</div>
</li>
</ul>
</div>
</div>
<div id="mapDetails" class="neshan-container"></div>
</div>
</div>
</div>
<div class="card-footer">
<form>
<div class="row form-group">
<div class="col-md-1">
<label class="label" for="text-input"> title</label></div>
<div class="col-md-4">
<input type="text"
#title="ngModel"
[(ngModel)]="showResult.title"
name="title"
class="form-control input-sm"
id="title"
maxlength="50" />
</div>
<div class="col-md-1">
<label class="label" for="text-input">position</label></div>
<div class="col-md-3">
<input type="text"
required
#lat="ngModel"
[(ngModel)]="showResult.lat"
name="lat"
class="form-control input-sm"
id="lat"
maxlength="50" />
<span *ngIf="!lat.valid" class="errormessage">*</span>
</div>
<div class="col-md-3">
<input type="text"
required
#lng="ngModel"
[(ngModel)]="showResult.lng"
name="lng"
class="form-control input-sm"
id="lng"
maxlength="50" />
<span *ngIf="!lng.valid" class="errormessage">*</span>
</div>
</div>
<div class="row form-group">
<div class="col-md-1"><label class="label" for="text-input">address</label></div>
<div class="col-md-11">
<input type="text"
required
#address="ngModel"
[(ngModel)]="showResult.address"
name="address"
class="form-control input-sm"
id="address"
maxlength="150" />
<span *ngIf="!address.valid" class="errormessage">*</span>
</div>
</div>
<button class="k-button k-primary" [disabled]="!(lat.valid &lng.valid && address.valid)" (click)="setLocation()">accept</button>
<button class="k-button" (click)="activeModal.dismiss()">
<span aria-hidden="true">close</span>
</button>
</form>
</div>
</div>
</pre>
Ts code
public marker: any;
public mymap: any;
public lat: any
public lng: any
public showResultTemp: MapLocation=new MapLocation();
public showResultTemp1: MapLocation=new MapLocation();
public showResult: MapLocation=new MapLocation();
ngOnInit(): void {
this.showResult= new MapLocation();
this.showResultTemp=new MapLocation();
this.showResultTemp1=new MapLocation();
this.loadMap();
}
loadMap(): void {
if(this.mapData != null)
{
this.lat=this.mapData.Lat;
this.lng=this.mapData.Lng;
}
else
{
this.lat= 36.31329984170837;
this.lng= 59.56285528431181;
}
this.myMap = new L.Map('mapDetails', {
key: Helpers._webMapKey,
servicekey: Helpers._serviceMapKey,
maptype: 'dreamy',
timeoutReady: 0,
zoomControl: true,
center: [this.lat,this.lng],
searchPlaceholderText: "search",
zoom: 14,
activeMarker: true,
search: true,
poi: true,
traffic: true
});
this.myMap.setMapType("dreamy");
this.marker=null;
this.marker = new L.Marker([this.lat,this.lng],{draggable:true}).addTo(this.myMap);
this.marker.on('drag', this.searchOriginWithLatLng);
this.marker.on('dragend', this.searchOriginWithLatLng);
}
searchOriginWithLatLng(event)
{
this.showResultTemp= new MapLocation();
const queryUrl = `https://api.neshan.org/v2/reverse?&lat=${event.target._latlng.lat}& lng=${event.target._latlng.lng}`;
let headers = new HttpHeaders().set('Content-Type', 'text')
.append('Api-Key', Helpers._serviceMapKey);
const result = ajax({
method: 'GET',
url: queryUrl,
headers: {
'Api-Key': Helpers._serviceMapKey
}
});
result.subscribe((response:any) => {
this.changeMarkerDate = response.response;
this.showResultTemp.title=this.changeMarkerDate.route_name;
this.showResultTemp.address=this.changeMarkerDate.formatted_address;
this.showResultTemp.lat=this.lat;
this.showResultTemp.lng=this.lng;
this.showResult= this.showResultTemp;
});
}
ngAfterViewInit(): void {
this.showResult= new MapLocation();
this.marker1.on('dragend', this.searchOriginWithLatLngMarker1);
}
ngAfterContentInit(): void {
}
searchOriginWithLatLngMarker1(event)
{
this.showResultTemp= new MapLocation();
const queryUrl = `https://api.neshan.org/v2/reverse?&lat=${event.target._latlng.lat}&lng=${event.target._latlng.lng}`;
let headers = new HttpHeaders().set('Content-Type', 'text')
.append('Api-Key', Helpers._serviceMapKey);
const result = ajax({
method: 'GET',
url: queryUrl,
headers: {
'Api-Key': Helpers._serviceMapKey
}
});
result.subscribe((response:any) => {
this.changeMarkerDate = response.response;
this.showResultTemp.title=this.changeMarkerDate.route_name;
this.showResultTemp.address=this.changeMarkerDate.formatted_address;
this.showResultTemp.lat=event.target._latlng.lat;
this.showResultTemp.lng=event.target._latlng.lng;
this.showResult=this.showResultTemp;
this.showResult.address=this.showResult.address.replace("استان خراسان رضوی،","");
this.showResult.address=this.showResult.address.replace("مشهد،","");
this.showResult.address=this.showResult.address.trimStart();
this.showResult.address=this.showResult.address.trimEnd();
(document.getElementById("SrcRegion") as HTMLTextAreaElement).value=this.showResult.region;
(document.getElementById("SrcTitle") as HTMLTextAreaElement).value=this.showResult.title;
// document.getElementById('SrcAddress').setAttribute("value",this.showResult.address);
(document.getElementById("SrcAddress") as HTMLTextAreaElement).value=this.showResult.address;
(document.getElementById("SrcLat") as HTMLTextAreaElement).value=this.showResult.lat;
(document.getElementById("SrcLng") as HTMLTextAreaElement).value=this.showResult.lng;
event.target.bindPopup(this.showResult.title).openPopup();
const dstlat= (document.getElementById("DstLat") as HTMLTextAreaElement).value
const dstlng=(document.getElementById("DstLng") as HTMLTextAreaElement).value
// this.travelModel.SrcLat=this.showResult.lat;
// this.travelModel.SrcLng=this.showResult.lng;
if(dstlat != undefined && dstlat != null && dstlat!= ""
&& dstlng != undefined && dstlng != null && dstlng!= "")
{
this.parameterDirection={
type: "car",
origin: [this.showResult.lat,this.showResult.lng],
destination: [dstlat,dstlng],
avoidTrafficZone: true,
avoidOddEvenZone: true,
alternative: true,
};
const queryUrl2 = `https://api.neshan.org/v3/direction?type=${ this.parameterDirection.type}&origin=${ this.parameterDirection.origin}&destination=${ this.parameterDirection.destination}&avoidTrafficZone=${ this.parameterDirection.avoidTrafficZone}&avoidOddEvenZone=${ this.parameterDirection.avoidOddEvenZone}&alternative=${ this.parameterDirection.alternative}`;
//const queryUrl = `https://api.neshan.org/v1/search`;
let headers = new HttpHeaders().set('Content-Type', 'text')
.append('Api-Key', Helpers._serviceMapKey);
const result = ajax({
method: 'GET',
url: queryUrl2,
headers: {
'Api-Key': Helpers._serviceMapKey
}
});
result.subscribe((response:any) => {
this.resultDirections=response.response.routes;
this.resultDirection=this.resultDirections[0];
//this.travelModel.Distance=Math.round(this.resultDirection.legs[0].distance.value/1000);
const distance=Math.round(this.resultDirection.legs[0].distance.value/1000);
document.getElementById('lbldistance').innerHTML= this.resultDirection?.legs[0].distance.text;
document.getElementById('lbltime').innerHTML= this.resultDirection?.legs[0].duration.text;
// document.getElementById('Distance').setAttribute("value",distance.toString());
(document.getElementById("Distance") as HTMLTextAreaElement).value=distance.toString();
const dateObj = new Date(this.resultDirection.legs[0].duration.value * 1000);
// this.travelModel.TotalTime={hours:0,minutes:0};
const h=dateObj.getUTCHours();
const d=dateObj.getUTCMinutes();
// this.duration.minutes=dateObj.getUTCHours();
// this.duration.hours=dateObj.getUTCMinutes();
// this.travelModel.TotalTime.hours= h;
// this.travelModel.TotalTime.minutes= d;
// this.travelModel.FirstServicePrice=(this.station?.InputPrice +(this.station?.KMPrice* this.travelModel.Distance)+(this.station?.DelayPrice* ((h * 60) + d)));
const inputPrice=(document.getElementById("InputPrice") as HTMLTextAreaElement).value;
const kmPrice=(document.getElementById("KMPrice") as HTMLTextAreaElement).value;
const delayPrice=(document.getElementById("DelayPrice") as HTMLTextAreaElement).value;
//document.getElementById('FirstServicePrice').setAttribute("value",(+inputPrice +(+kmPrice * distance)+(+delayPrice * ((h * 60) + d))).toString());
const firstPrice=(+inputPrice +(+kmPrice * distance)+(+delayPrice * ((h * 60) + d)));
(document.getElementById("FirstServicePrice") as HTMLTextAreaElement).value=Helpers.roundNumber(firstPrice).toString();
let now = new Date();
let hours = ("0" + h).slice(-2);
let minutes = ("0" + d).slice(-2);
let str = hours + ':' + minutes;
this.durectiontime=str;
(document.getElementById("durectiontime") as HTMLTextAreaElement).value=this.durectiontime;
});
}
});
}