2016-09-13 2 views
1

Я пытаюсь связать элемент управления input с объектом масштабирования карты управления третьей стороной в двухстороннем способе привязки данных (вход должен всегда показывать текущий уровень масштабирования, и если пользователь меняет его, карта должна приближаться к этому уровню)Проблема с привязкой к Angular2 twoway

В настоящее время он работает только в одном направлении: изменения в поле ввода не применяются к карте.

@Component({ 
    selector: 'map-view', 
    template: '<div id="mapView"></div><input [(value)]=zoom />' 
}) 
export class MapViewComponent { 
    view: any = null; 

    public zoom: number = 10; 


    constructor(private _mapService: SimpleMapService, private elRef: ElementRef) { 
    } 

    ngOnInit() { 
     this.view = new MapView({ 
      container: this.elRef.nativeElement.firstChild, 
      map: this._mapService.map, 
      zoom: this.zoom, 
      center: [10.44, 42.947974]   
     }) 

     this.view.watch('zoom', function(newVal, oldVal, propertyName) { 
      this.zoom = newVal; 
     }.bind(this));  

    } 

} 

EDIT: Поэтому я добавил

<input [(ngModel)]="zoom" (ngModelChange)="updateZoom($event)"> на вход

и

updateZoom(newValue) { 
    this.view.zoom = newValue; 
} 

компоненту

и это, кажется, работает. Но действительно ли это так, как это должно быть сделано? В Angular1 он работал с $scope.$apply без каких-либо событий.

+1

Вы также можете использовать функции стрелок, чтобы сохранить область 'this'' this.view.watch ('zoom', (newVal, oldVal, propertyName) => { this.zoom = newVal; };' I думаю, что это делает код короче и легче читать. –

+1

Angular2 не использует двустороннюю привязку по соображениям производительности. См. также мой ответ на http://stackoverflow.com/questions/39460810/angular-2-do-we- нужно-избегать-двух-путь-databind-when-not-needed –

+0

А я вижу! Спасибо. Как я мог пропустить это. – user66875

ответ

1

Попробуйте следующее <input [(value)]="zoom"; // < ----- добавлены двойные кавычки вокруг увеличения

ИЛИ

Что об использовании <input [(ngModel)]="zoom" >?

+2

Кавычки не должны быть необходимы, если выражение не содержит пробелов или специальных символов. Проблема заключается в том, что событие 'valueChange' отсутствует. Вот почему' [(value)] = ... 'не работает. Поэтому ваше второе предложение является точечным. –

+1

Спасибо, ребята. Я обновил свой пост в ответ на ваше предложение с событием изменения стоимости. – user66875

Смежные вопросы