【问题标题】:Angular 11, how to bind a new object in template, to componentAngular 11,如何将模板中的新对象绑定到组件
【发布时间】:2021-09-25 23:02:51
【问题描述】:

当用户从选项下拉列表中加载不同的选择(对象)时,我想获取在(更改)函数中返回的新对象。但是,即使选择正确更改,它每次都返回默认对象。使用 $scope 时,这种类型的绑定在 AngularJs 中有效。不确定我的 Angular 11 ngModel 等是否正确。 (我已经导入了 FormsModule)

component.ts...

 public selectedQuery: any;


// default object...
 public myQueries: [{ 
 myQueryId: number, 
 myQueryCreatedDate: Date, 
 myQueryString: string 
 }] = [{
    myQueryId: 0,
    myQueryCreatedDate: new Date(),
    myQueryString: "Please select a query"
  }]


dropDownListBuild(); // function builds correctly, loads myQueries array with options
...

this.selectedQuery = this.myQueries[0]; // gets set as default
...


onQueryChange(query: any) {
    console.log(this.selectedQuery + query); // not seeing any change happen
  }

component.html...

<div class="selectClass">
    <select [(ngModel)]="selectedQuery" (change)="onQueryChange(selectedQuery)">
            <option *ngFor="let opt of myQueries" [ngValue]="selectedQuery"> {{opt.myQueryString}}</option>
     </select>       
</div>

【问题讨论】:

    标签: angular typescript angular2-databinding


    【解决方案1】:

    将您的 HTML 代码更改为以下内容:

    <div class="selectClass">
      <select [(ngModel)]="selectedQuery" (ngModelChange)="onQueryChange($event)">
        <option *ngFor="let opt of myQueries" [ngValue]="opt">
          {{ opt.myQueryString }}
        </option>
      </select>
    </div>
    

    变化:

    1. 使用 (ngModelChange)="onQueryChange($event)" 而不是 (change)=onQueryChange(selectedQuery) 来获取新查询 - 更多详细信息如下。
    2. [ngValue]="selectedQuery" 更改为[ngValue]="opt" - 以前的版本意味着您重复三次相同的查询作为值,您只是更改了显示的文本(因此每个选项都显示正确的显示文本,但值始终相同)。

    有关更改事件的更多详细信息: 即使没有 Angular,(change) 也必然会触发更改事件,这只是经典的输入更改事件。您可以在没有 ngModel 的情况下使用它,但与 ngModel 一起使用效果并不特别好,因为在更新 ngModel 之前会(或至少可能)触发此事件。

    这就是为什么你应该使用专用的(ngModelChange),它是ngModel 指令的输出,所以它总是在ngModel 的模型改变后被触发。

    顺便说一句。如果您不需要检测查询更改的时刻,而只需将正确的查询存储在 selectedQuery 属性中 - 只需应用第二次修复,您就可以删除 ngModelChange

    【讨论】:

    • 感谢您的输入,正在返回... "3: Object" 不确定如何访问对象属性?
    • query.target.value 是您的查询对象,因此您可以简单地通过属性名称访问属性。更新了我的示例以显示如何访问属性以及如何使用 JSON.stringify 作为示例打印整个对象。
    • 我同意这应该可行,但所有这些都未定义。我可以从 ngModel "selectedQuery" 中获取我需要的属性,但它没有使用 onQueryChange 进行更新,它保持默认的 [0] 值。
    • 我真的很抱歉,但我昨天完全错了。更新了我的答案,所以现在它应该是完全正确的。请检查当前版本,它应该可以解决您的问题。
    • 你摇滚!解决了它,我非常感谢你。
    猜你喜欢
    • 1970-01-01
    • 2017-07-03
    • 2016-10-07
    • 2019-02-25
    • 2017-07-05
    • 1970-01-01
    • 2015-09-22
    • 2011-09-06
    • 1970-01-01
    相关资源
    最近更新 更多