NativeScript / Angular Page.getViewById 返回“未定义”

dsd*_*vkh 4 nativescript angular2-nativescript angular

我正在开发 NativeScript/Angular 应用程序。我是 NativeScript 的新手,正在学习基于早期版本的教程(我的是 4.1.0,不确定他们在使用什么)。有一个带有 DatePicker 元素的模式对话框。我希望它将所选日期返回给父元素。该应用程序编译并启动得很好。但是,当我尝试打开模态时,出现错误“无法设置未定义的‘年份’属性”。

HTML如下:

<StackLayout class="modal-view-style">
  <StackLayout>
    <DatePicker id="datePicker"></DatePicker>
  </StackLayout>
  <Button class="btn btn-primary btn-active" text="submit" (tap)="submit()"></Button>
</StackLayout>
Run Code Online (Sandbox Code Playgroud)

这是课程:

import { Component, OnInit, ViewChild, ElementRef } from '@angular/core';
import { ModalDialogParams } from 'nativescript-angular/modal-dialog';
import { DatePicker } from 'tns-core-modules/ui/date-picker';
import { Page } from 'tns-core-modules/ui/page';

@Component({
  moduleId: module.id,
  templateUrl: './date-picker-modal.component.html'
})
export class DatePickerModalComponent implements OnInit {

  constructor(private params: ModalDialogParams, private page: Page) { }

  ngOnInit() { 
    let datePicker: DatePicker = <DatePicker>this.page.getViewById<DatePicker>('datePicker');

      let currentdate: Date = new Date();
      datePicker.year = currentdate.getFullYear();
      datePicker.month = currentdate.getMonth() + 1;
      datePicker.day = currentdate.getDate();
      datePicker.minDate = currentdate;
      datePicker.maxDate = new Date(2045, 4, 12);
  }

  public submit() {
      let datePicker: DatePicker = <DatePicker>this.page.getViewById<DatePicker>('datePicker');
      let selectedDate = datePicker.date;

      let reserveTime = new Date(
        selectedDate.getFullYear(),
        selectedDate.getMonth(),
        selectedDate.getDate()
      ));
      this.params.closeCallback(reserveTime.toISOString());
  }

}
Run Code Online (Sandbox Code Playgroud)

有谁知道发生了什么?我假设只是 api 发生了变化,但我无法在文档中找到它。如果我对此是正确的,将不胜感激指向文档中适当位置的链接。另外,如果这不是做这种事情的“首选”方式,我很想知道什么是。谢谢。

Dot*_*mer 5

如果您在 Angular 中使用 NativeScript,则使用 Angular 模板变量语法,如下所示:

<StackLayout class="modal-view-style">
  <StackLayout>
    <!-- notice the # -->
    <DatePicker #datePicker></DatePicker>
  </StackLayout>
  <Button class="btn btn-primary btn-active" text="submit" (tap)="submit()"></Button>
</StackLayout>
Run Code Online (Sandbox Code Playgroud)

你的组件应该是这样的:

import { Component, OnInit, ViewChild, ElementRef } from '@angular/core';
import { ModalDialogParams } from 'nativescript-angular/modal-dialog';
import { DatePicker } from 'tns-core-modules/ui/date-picker';
import { Page } from 'tns-core-modules/ui/page';

@Component({
  moduleId: module.id,
  templateUrl: './date-picker-modal.component.html'
})
export class DatePickerModalComponent implements OnInit {
  @ViewChild('datePicker') dp: ElementRef;

  datePicker: DatePicker;
  constructor(private params: ModalDialogParams, private page: Page) { }

  ngOnInit() { 
      this.datePicker = <DatePicker>this.dp.nativeElement;

      let currentdate: Date = new Date();
      this.datePicker.year = currentdate.getFullYear();
      this.datePicker.month = currentdate.getMonth() + 1;
      this.datePicker.day = currentdate.getDate();
      this.datePicker.minDate = currentdate;
      this.datePicker.maxDate = new Date(2045, 4, 12);
  }

  public submit() {
      let selectedDate = this.datePicker.date;

      let reserveTime = new Date(
        selectedDate.getFullYear(),
        selectedDate.getMonth(),
        selectedDate.getDate()
      ));
      this.params.closeCallback(reserveTime.toISOString());
  }
}
Run Code Online (Sandbox Code Playgroud)