ディレクティブを使用して入力ngModel
値にアクセスして変更する方法に固執しています。この問題の結果、目的のアドレスを選択してもモデルのアドレス値が更新されません...入力の最終値ではなく、実際に入力に入力したものに設定されるだけです。
「830」と入力します:
「8300Fauntleroy Way Southwest、Seattle、WA、United States」を選択します:
結果の値:
_{
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());
と同等の方法を理解していないことです。
どんな援助も大歓迎です。
ngModelChange
を要素にバインドしていないため、なぜ機能するのかわかりませんが、これを機能させることになりました...しかし、機能します。
指令:
/// <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>
入力に関連付けられたControlValueAccessor
を挿入します。サンプルは次のとおりです。
@Directive({
selector: '[test]'
})
export class TestDirective {
constructor(@Inject(NG_VALUE_ACCESSOR) private valueAccessor:ControlValueAccessor) {
setTimeout(() => {
this.valueAccessor[0].writeValue('test');
}, 1000);
}
}
たとえば、このplunkrを参照してください: https://plnkr.co/edit/owhBHdBncAxlzwJ8xkfq?p=preview 。
これは私が私のdatepickerでしたことです、助けになるかもしれません。
//Create a method in your component to change the model
dateChanged(date) {
this.hero.bday = date;
}
public ngOnInit() {
//CREATE A REFERERENCE TO YOUR COMPONENT
var component:CreateEventComponent = this;
$("#bday").datepicker({
dateFormat: "dd-mm-yy",
altFormat: "dd-mm-yy",
onSelect: function (dateText, datePicker) {
//UPDATE YOUR MODEL FORM JQUERY CODE.
component.dateChanged(dateText);
}
});
}