首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用指令角2更改输入的ngModel值

使用指令角2更改输入的ngModel值
EN

Stack Overflow用户
提问于 2016-06-02 17:51:37
回答 3查看 12.5K关注 0票数 10

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

I输入'830':

I选择‘8300FauntleroyWay西南,西雅图,美国,美国’:

结果值:

代码语言:javascript
复制
{
  address: '830'
}

期望值:

代码语言:javascript
复制
{
  address: '8300 Fauntleroy Way Southwest, Seattle, WA, United States'
}

在AngularJS中,我可以这样做:

代码语言:javascript
复制
(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());
        });
      });
    }
  }

})();

但是现在我想把它转换成2角,我有点卡住了。到目前为止,我对转换的看法如下:

代码语言:javascript
复制
/// <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));
  }

}

用法:

代码语言:javascript
复制
<input type="text"
       ngControl="address"
       placeholder="Enter a location"
       [(ngModel)]="subject.address"
       #address="ngForm"
       google-places
       required>

问题的核心是,我不明白如何在角2中实现等效的model.$setViewValue(element.val());

如能提供任何协助,将不胜感激。

柱塞

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-06-02 23:53:03

我最终让它工作了,尽管我不明白为什么它会工作,因为我没有将ngModelChange绑定到element...but --它可以工作。

指令:

代码语言:javascript
复制
/// <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));
    });
  }

}

组件模板:

代码语言:javascript
复制
<input type="text"
            class="form-control"
            ngControl="address"
            id="subjectAddress"
            placeholder="Enter a location"
            [(ngModel)]="subject.address"
            #address="ngForm"
            google-places
            required>
票数 6
EN

Stack Overflow用户

发布于 2016-06-02 18:05:21

我将注入与您的输入相关联的ControlValueAccessor。以下是一个示例:

代码语言:javascript
复制
@Directive({
  selector: '[test]'
})
export class TestDirective {
  constructor(@Inject(NG_VALUE_ACCESSOR) private valueAccessor:ControlValueAccessor) {
    setTimeout(() => {
      this.valueAccessor[0].writeValue('test');
    }, 1000);
  }
}

参见这个柱塞,例如:https://plnkr.co/edit/owhBHdBncAxlzwJ8xkfq?p=preview

票数 1
EN

Stack Overflow用户

发布于 2016-11-10 10:57:32

这就是我用我的数据机所做的,也许会有帮助。

代码语言:javascript
复制
//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);
        }
    });
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37598895

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档