角度 6:在选择“选择”的值后尝试循环抛出一个对象(通过 *ngFor)

Posted

技术标签:

【中文标题】角度 6:在选择“选择”的值后尝试循环抛出一个对象(通过 *ngFor)【英文标题】:angular 6: trying loop throw an object (via *ngFor) after choosing a value of a 'select' 【发布时间】:2018-12-26 14:36:38 【问题描述】:

我正在尝试构建一个用于订购电影的“快速订购”组件。

第一个元素是“选择”。我通过 http 请求获取结果,然后呈现选项。

当用户选择电影选项时,我需要向他显示另一个显示可用日期的选项。我需要根据以字符串日期作为键的对象来呈现选择。

例如:


    "2018-07-19": 
        "00:10": "5b4f445da2c93e36c4f1a1ca",
        "01:00": "5b4f355ab6334b27fc031adb",
        "13:44": "5b4f43fda2c93e36c4f1a1c9"
    ,
    "2018-07-25": 
        "23:00": "5b4f357db6334b27fc031adc"
    

movieList 选择的呈现和检索日期对象的一切工作正常。但是当我添加第二个选择 (id=selectDate) 的 html 代码时,我得到一个错误。

这是我的代码: ts:

import  Component, OnInit  from '@angular/core';
import  MoviesService  from '../services/movies.service';
import  ShowService  from '../services/show.service';
import  Observable  from 'rxjs';
import * as moment from 'moment';

@Component(
  selector: 'app-quick-order',
  templateUrl: './quick-order.component.html',
  styleUrls: ['./quick-order.component.css']
)
export class QuickOrderComponent implements OnInit 

  movieList: any;
  movieShowsSchedule: any;
  selectedMovie: any;
  selectedDate: any;


  constructor(private moviesService: MoviesService, private showService: ShowService)  

  ngOnInit() 
    this.movieList = this.moviesService.getMovies();
  

  onChangeSelectMovie() 
    this.movieShowsSchedule = this.showService.getMovieSchedule(this.selectedMovie).subscribe(res => 
      alert("we got movie successfully");
      console.log(res);
    , err => 
      alert("we did not get movie");
    );
  

  onChangeSelectDate() 

  


html:

<div class="form-group">
    <label for="selectMovie">Movie:</label>
    <select id="selectMovie" [(ngModel)]="selectedMovie" (change)="onChangeSelectMovie()">
      <option *ngFor="let movie of movieList | async" value="movie._id" >movie.title </option>
    </select>
    <label for="selectDate">Date:</label>
    <select id="selectDate" [(ngModel)]="selectedDate" (change)="onChangeSelectDate()">
      <option *ngFor="let date in movieShowsSchedule | async" value="date" >date</option>
    </select>
  </div>

有人知道问题出在哪里吗?以及如何使此代码起作用? 非常感谢!

【问题讨论】:

请勿张贴图片向我们展示文字。 【参考方案1】:

有几个问题。

    由于您使用的是 async,因此您应该将 moveShowSchedule 设置为 Observable 而不是 Subscription 的结果,或者更简单,不要使用异步。 您可以使用map 将movieShowSchedule 转换为可用于您的视图的模型。 您应该将 *ngFor 中的 in 替换为 of

组件

movieShowsSchedule = [];

onChangeSelectMovie() 
  this.showService.getMovieSchedule(this.selectedMovie).subscribe(x => 
    this.moveShowSchedule = [];
    for (let key in x) 
      this.moveShowSchedule.push( key, date: x[key].date );
    
  );

HTML

<option *ngFor="let x of movieShowsSchedule" [ngValue]="x.date">
    x.date
</option>

我不想重构你的整个代码,但是如果你创建了一个绑定到 change 事件的 Observable,那么你可以使用 switchMap 来更新一个 movieShowSchedule 主题。

【讨论】:

是的。但我想获得“movieShowsSchedule”的钥匙。不是价值.. 即使我将其更改为 of。并将 date 更改为像“asdasd”这样的随机文本,我仍然收到错误“ERROR Error: InvalidPipeArgument: '[object Object]' for pipe 'AsyncPipe'” @codingnighter2000,这些更改有帮助吗? 谢谢。正在努力。我怎样才能“/* ...转换为数组*/”?我应该导入什么?你能提供那个“地图点击”的链接吗? map 是 rxjs 的一部分,如果您使用 angular,您肯定已经在使用它。我会稍微简化一下答案。我不需要完全看中地图和水龙头。

以上是关于角度 6:在选择“选择”的值后尝试循环抛出一个对象(通过 *ngFor)的主要内容,如果未能解决你的问题,请参考以下文章

求VBA高手 ComboBox 自动出现在单元格,选择值后自动赋值给当前单元格的问题

更改 DropdownList 值后更改 ASP 标签文本颜色?

循环选择单元格时需要对象错误

选择值后强制 FilteringSelect 失去焦点

如何在角度5中选择循环中的dom元素

选择值后如何将下拉菜单转换为标签。单击按钮后再次转换为下拉菜单