gpt4 book ai didi

angular - 使用指令 Angular 2 更改输入的 ngModel 值

转载 作者:太空狗 更新时间:2023-10-29 17:10:16 25 4
gpt4 key购买 nike

我一直在研究如何使用指令访问和更改输入 ngModel 值。问题的结果是,当我选择所需的地址时,模型的地址值不会更新...它只是设置为我实际输入到输入中的内容,而不是输入的最终值。

我输入“830”:

enter image description here

我选择“8300 Fauntleroy Way Southwest, Seattle, WA, United States”:

enter image description here

结果值:

{
address: '830'
}

期望值:

{
address: '8300 Fauntleroy Way Southwest, Seattle, WA, United States'
}

在 AngularJS 中我可以这样做:

(function() {
'use strict';

angular
.module('casemanagerApp')
.directive('googleplace', googleplace);

function googleplace() {

var directive = {
require: 'ngModel',
link: link
};

return directive;

function link(scope, element, attrs, model) {
var options = {
types: [],
componentRestrictions: {}
};
scope.gPlace = new google.maps.places.Autocomplete(element[0], options); // jshint ignore:line

google.maps.event.addListener(scope.gPlace, 'place_changed', function() { // jshint ignore:line
scope.$apply(function() {
model.$setViewValue(element.val());
});
});
}
}

})();

但现在我正在尝试将它转换为 Angular 2,我有点卡住了。到目前为止,这是我对转换的了解:

/// <reference path="../../../../typings/browser/ambient/googlemaps/index.d.ts"/>

import { Directive, ElementRef, OnInit } from '@angular/core';

@Directive({
selector: '[google-places]'
})
export class GooglePlaces implements OnInit {

constructor(private _el: ElementRef) { }

ngOnInit() {
let gPlace = new google.maps.places.Autocomplete(this._el.nativeElement);
google.maps.event.addListener(gPlace, 'place_changed', () => console.log(this._el.nativeElement));
}

}

用法:

<input type="text"
ngControl="address"
placeholder="Enter a location"
[(ngModel)]="subject.address"
#address="ngForm"
google-places
required>

问题的核心是我不明白如何在 Angular 2 中执行与 model.$setViewValue(element.val()); 等效的操作。

如有任何帮助,我们将不胜感激。

Plunker

最佳答案

我最终让它工作了,虽然我不明白为什么它会工作,因为我没有将 ngModelChange 绑定(bind)到元素......但它工作。

指令:

/// <reference path="../../../../typings/browser/ambient/googlemaps/index.d.ts"/>

import { Directive, ElementRef, Output, EventEmitter, OnInit, NgZone } from '@angular/core';

@Directive({
selector: '[google-places]'
})
export class GooglePlaces implements OnInit {
@Output() ngModelChange: EventEmitter<any> = new EventEmitter(false);

options = {
types: ['address'],
componentRestrictions: { country: "us" }
};

constructor(
private _el: ElementRef,
private _ngZone: NgZone) { }

ngOnInit() {
let gPlace = new google.maps.places.Autocomplete(this._el.nativeElement, this.options);
google.maps.event.addListener(gPlace, 'place_changed', () => {
this._ngZone.run(() =>
this.ngModelChange.emit(this._el.nativeElement.value));
});
}

}

组件模板:

<input type="text"
class="form-control"
ngControl="address"
id="subjectAddress"
placeholder="Enter a location"
[(ngModel)]="subject.address"
#address="ngForm"
google-places
required>

关于angular - 使用指令 Angular 2 更改输入的 ngModel 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37598895/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com