在 Angular 2 中加载第一页时设置 [(ngModel)] 的值

Posted

技术标签:

【中文标题】在 Angular 2 中加载第一页时设置 [(ngModel)] 的值【英文标题】:Setting value of [(ngModel)] upon first page load in Angular 2 【发布时间】:2016-11-06 22:33:06 【问题描述】:

我正在尝试创建一个简单的select 组件,它通过属性接收一些数据并呈现所需的选项。我打算在另一个组件的模板中使用这个选择组件,比如PageComponent 的模板(page.template.html)。

我正在使用[(ngModel)] 将PageComponent 的变量绑定到select 组件。选择一个选项后,变量 get 的值会按预期更新,但是如何在页面加载时将其设置为指向第一个选项,而不触发手动选择 select 组件?

这是代码。

在 page.template.html

<select ui-select 
        [options]="options" 
        [(ngModel)]="alertType"
        [defaultValue]="'Select an alert Type'">
</select>
alertType <!-- To see the value while debugging -->

在page.component.ts,PageComponent

alertType:any;
options = [
    id:1, value:"item-1",
    id:2, value:"item-2",
    id:3, value:"item-3"
];

在 select.component.ts 中

import Component, Input from '@angular/core'

@Component(
  selector: '[ui-select]',
  template: `
    <option *ngIf="defaultValue" value="-1">defaultValue</option>
    <option *ngFor="let option of options" [value]="option.id">option.value</option>
  `
)
export class SelectComponent 
  @Input() options: any;
  @Input() defaultValue: string;

现在,alertType 值最初不显示任何内容,并且仅在从 select 框中选择新选项时才会更新。

我明白这是因为alertTypePageComponent 中默认设置为未定义,但我不知道如何在页面加载时将其设置为第一个选项值。

更新

原始问题已得到解答,但我对此还有一个问题,因此更新了问题。

在更新后的代码中,select 组件接受来自模板的 defaultValue 自定义属性,并为该默认值呈现条件 &lt;option&gt;

现在,我怎么说如果设置了defaultValuealertType 应该具有该值,否则它应该具有options 列表中第一项的值。

P.S - 如果您有关于构建组件的方法的 cmets,请随时将它们添加到答案中,因为这将有助于我学习。

【问题讨论】:

"如果设置了 defaultValue" - 从哪里设置?以编程方式还是通过选择元素? page.template.html 中的select 框中设置为自定义属性。上面是[defaultValue]="'Select an alert Type'" 【参考方案1】:

因此,您希望将 alertType 设置为所选值,无论它可能来自您提供的 options 还是来自您的 defaultValue(第一个选项)。

这可以通过使用AfterViewInit钩子来完成,

修改后的代码将是..

@Component(  
  selector: 'my-app',
  directives:[ 
    SelectComponent
  ],
  template : `<select ui-select
        [options]="options"
        [(ngModel)]="alertType"
        [defaultValue]="'Select an alert Type'" #mySelect>
</select>
alertType`
)
export class App implements AfterViewInit
  @ViewChild('mySelect', read: ViewContainerRef) mySelect;
options = [
    id: 1, value: "item-1", selected: false,
    id: 2, value: "item-2", selected: true,//if all options will be false then defaultValue will be selected
    id: 3, value: "item-3", selected: false
];
alertType: any;

 ngAfterViewInit() 
    this.alertType = this.mySelect.element.nativeElement.value;
  


我创建了一个plunker,检查一下!!

【讨论】:

【参考方案2】:

你可以这样尝试:

options = [
    id:1, value:"item-1",
    id:2, value:"item-2",
    id:3, value:"item-3"
];

alertType: any = options[0].id;

【讨论】:

该死!这太简单了,我正在环游世界,想着什么不是。 :/我实际上还有其他问题,所以让我更新 OP。【参考方案3】:

对于您的新问题,您可以利用 ui-select 组件中的 selected 属性:

<option *ngIf="defaultValue" selected="true" value="-1">defaultValue</option>

【讨论】:

是否也将PageComponent中alertType变量的初始值设置为选择框的[(ngModel)] 我试过了,但在我实际选择一个选项之前它不会设置alertType 的值

以上是关于在 Angular 2 中加载第一页时设置 [(ngModel)] 的值的主要内容,如果未能解决你的问题,请参考以下文章

当当前页面不是第一页时,ViewPager在旋转屏幕后有错误的偏移数据

使用 UIPageViewController 的第一页时向左滑动返回

Django CMS - 创建第一页时模板不存在错误

vue框架,使用pagination组件进行分页时 分页不在第一页的时候保存了 筛选记录,然后f5刷新又到第一页了,到了onCurrentChange改变分页的函数改变了

PHP中模糊查询后实现分页时,只显示第一页信息,之后的页面信息不显示,求类似问题解决方法最好有代码,谢

UICollectionView 第二页内容显示在第一页