【问题标题】:Angular 2 how to filter object in viewAngular 2如何过滤视图中的对象
【发布时间】:2016-01-24 22:13:28
【问题描述】:

我在过滤视图中的对象时遇到问题。我的目标是从一个简单的网络服务加载一个任务列表(任务只有一个名称和一个状态(待办/完成))。

当我不使用 web 服务并且数据在我的服务中被硬编码时,我设法使用这样的自定义管道过滤我的结果

transform(value, args) {
    if (args[0] === true)
        return value.filter((item) => item.status == 'done');
    return value.filter((item) => item.status == 'todo');
}

视图是这样的

<ul class="list-group">
<li  class="list-group-item" *ngFor="#task of tasks | done: false">
    <button  class="btn btn-default btn-xs pull-right" (click)="task.setStatus('done')" *ngIf="(task.status == 'todo')">Done</button>
    {{ task.name }}
</li>

但由于我是从外部源加载数据,我无法使我的自定义管道工作,value 未定义可能是因为异步数据。

这里是组件加载数据:

export class TaskComponent implements OnInit {
task = new Task();
public tasks: Task[];

constructor(public _taskService: TaskService) { }

getTasks() {
    this._taskService.getWsTask().subscribe(tasks => this.tasks = tasks);
}

ngOnInit() {
    this.getTasks();
}

以及相关的服务

export class TaskService {
tasks: Task[];

constructor(public http: Http) {
    console.log('Task Service created.');
}

public getWsTask(){
    return this.http.get('http://localhost:3000/tasks')
        .map((responseData) => responseData.json())
        .map((tasks: Array<any>) => {
            let result: Array<Task> = [];
            if (tasks) {
                tasks.forEach((task) => {
                    result.push(
                        new Task(task.name, task.status));
                });
            }
            return result;
        });
        ;
}

您可以在这里找到我的服务类和组件:enter link description here

感谢您的帮助

【问题讨论】:

  • 没有任何工作示例,我认为您应该查看AsyncPipe

标签: pipe angular observable


【解决方案1】:

您需要检查过滤器中的值是否为空。事实上,value 参数一开始是空的。当从 HTTP 请求接收到列表时,将使用该值再次调用过滤器。

transform(value, args) {
  if (value != null) {
    if (args[0] === true) {
      return value.filter((item) => item.status == 'done');
    }
    return value.filter((item) => item.status == 'todo');
  }
}

按照 Eric 的建议,您还可以利用 async 管道,而不是直接在 observable 上调用 subscribe 函数:

getTasks() {
  this.tasks = this._taskService.getWsTask();
}

您的模板需要这样重构:

<ul class="list-group">
  <li class="list-group-item" *ngFor="#task of (tasks | async | done: false)">
    <button class="btn btn-default btn-xs pull-right"
            (click)="task.setStatus('done')"
            *ngIf="(task.status == 'todo')">Done</button>
      {{ task.name }}
  </li>
</ul>

希望对你有帮助 蒂埃里

【讨论】:

  • 是的,非常感谢。但是如果我对这个解决方案是正确的,那么任务“保持”一个可观察的,所以如果你需要通过调用服务类中的一个方法来添加一个任务,你需要“通知”任务,如果你想他们已经更新了见变化。我还不知道如何(以下方法似乎很有趣:coryrylan.com/blog/angular-2-observable-data-services 但经过几次尝试后对我不起作用)。我在官方文档中没有找到很多关于 observable 的信息,我发现这部分有点乱。
猜你喜欢
  • 2020-11-01
  • 1970-01-01
  • 2017-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-16
相关资源
最近更新 更多