nativeElement выбирает ожидание привязки данных

Для Qt, как вы делаете снимок экрана для определенного окна, нужно:

/*------ Take a screenshot of a window ------*/
// window is a: QWidget *window;
originalPixmap = QPixmap::grabWidget(window); 
1
задан rami zk 18 January 2019 в 16:48
поделиться

2 ответа

Как я понял, вы пытаетесь получить элемент до его визуализации. Это невозможно. Я советую вам прочитать о крюках Lifecycle в Angular. https://angular.io/guide/lifecycle-hooks

Вы можете решить эту проблему, вызвав функцию foo () в хуке жизненного цикла - ngAfterViewInit.

ngAfterViewInit() {
   this.foo();
}
0
ответ дан Dmitriy Kavraiskyi 18 January 2019 в 16:48
поделиться

Очевидно, ngModel обновляет значение представления асинхронно при изменении модели. То есть значение <input> не изменяется до следующего цикла обнаружения изменений!

Из исходного кода ngModel :

/**
 * `ngModel` forces an additional change detection run when its inputs change:
 * E.g.:
 * ```
 * <div>{{myModel.valid}}</div>
 * <input [(ngModel)]="myValue" #myModel="ngModel">
 * ```
 * I.e. `ngModel` can export itself on the element and then be used in the template.
 * Normally, this would result in expressions before the `input` that use the exported directive
 * to have and old value as they have been
 * dirty checked before. As this is a very common case for `ngModel`, we added this second change
 * detection run.
 *
 * Notes:
 * - this is just one extra run no matter how many `ngModel` have been changed.
 * - this is a general problem when using `exportAs` for directives!
 */
const resolvedPromise = Promise.resolve(null);

Затем при обновлении модели представление обновляется асинхронно :

private _updateValue(value: any): void {
  resolvedPromise.then(
      () => { this.control.setValue(value, {emitViewToModelChange: false}); });
}

Таким образом, setTimeout гарантирует, что вход был выбран после того, как его представление было обновлено.

Если вы хотите избежать этого асинхронного поведения, вы можете использовать FormControl вместо ngModel ( Demo StackBlitz ):

import { Component, Input, ViewChild, ElementRef } from '@angular/core';
import { FormControl } from '@angular/forms';

@Component({
  selector: 'hello',
  template: `<input #input [formControl]="count" />`,
  styles: [`h1 { font-family: Lato; }`]
})
export class HelloComponent {
  private _item;

  @Input() set item(value) {
    this._item = value;
    this.count.setValue(value.count);
    this.focus();
  }

  get item() {
    return this._item;
  }

  @ViewChild('input') input: ElementRef;

  count = new FormControl();

  focus() {
    this.input.nativeElement.focus();
    this.input.nativeElement.select();
  }
}

При таком подходе вы не Мне нужно явно вызвать focus() из родительского компонента; дочерний компонент будет вызывать свой собственный метод фокусировки при каждом изменении ввода.

0
ответ дан Alex K 18 January 2019 в 16:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: