【问题标题】:Filtering JSON by key value using pipes使用管道按键值过滤 JSON
【发布时间】:2016-04-03 13:13:42
【问题描述】:

我有一个对象数组,格式如下:

{
            img: './app/images/codeeval.png',
            name: 'codeEval',
            repo: 'https://github.com/Shooshte/CodeEval',
            description: 'CodeEval challenges solutions written in javascript and posted to gitHub.',
            github: true,
            demo: false,
            finished: true
        }

现在我要做的是编写一个自定义管道,它接受一个字符串,然后检查对象是否将此字符串设置为 true。所以假设我传入'demo',它将返回所有具有demo: true 的对象。

我的html:

<div *ngFor="#p of pages | pagesFilter: 'demo'" class="portfolioPageContainer">
    <img [attr.src]="p.img" class="portfolioThumbnail">
    <h2>{{ p.name }}</h2>
    <a [attr.href]="p.repo">
        <div>
            <p>{{ p.description }}</p>
        </div>
        <p class="portfolioRepoLink">See the Code!</p>
    </a>
</div>

我的组件:

import { Component } from 'angular2/core';
import {ViewEncapsulation} from 'angular2/core';
import {Pipe, PipeTransform} from 'angular2/core';

@Component({
    selector: 'portfolio',
    templateUrl: '/app/views/portfolio.html',
    styleUrls: ['../app/styles/PortfolioMobile.css', '../app/styles/PortfolioOther.css'],
    pipes: [pagesFilter],
    encapsulation: ViewEncapsulation.None
})

export class PortfolioComponent {
    pages = [{
        img: './app/images/placeholder.png',
        name: 'veryNiceWords',
        repo: 'https://github.com/Shooshte/veryNiceWords',
        description: 'A hobby app, made to enable posting, rating and sharing quotes over social networks. Work in progress.',
        github: true,
        demo: false,
        finished: false
    },
        {
            img: './app/images/placeholder.png',
            name: 'ZIC IJS',
            repo: 'https://github.com/Shooshte/ZIC',
            description: 'Refurbishing of on old library webpage with AngularJS.',
            github: true,
            demo: false,
            finished: false
        },
        {
            img: './app/images/weather.png',
            name: 'Show the Local weather',
            repo: 'http://codepen.io/shooshte/pen/NxOwOX',
            description: 'A freeCodeCamp exercise, designed to show the local weather.',
            github: false,
            demo: true,
            finished: true
        },
        {
            img: './app/images/calculator.png',
            name: 'Calculator',
            repo: 'http://codepen.io/shooshte/pen/qbjJdy',
            description: 'A freeCodeCamp exercise, which requires you to build a javascript calculator.',
            github: false,
            demo: true,
            finished: true
        },
        {
            img: './app/images/github.png',
            name: 'MTGO Draft Replayer',
            repo: 'https://github.com/Shooshte/MTGO-Draft-Replayer',
            description: 'A simple web app that opens a MTGO draft log file, and re-creates the draft from it.',
            github: true,
            demo: false,
            finished: false
        },
        {
            img: './app/images/codeeval.png',
            name: 'codeEval',
            repo: 'https://github.com/Shooshte/CodeEval',
            description: 'CodeEval challenges solutions written in javascript and posted to gitHub.',
            github: true,
            demo: false,
            finished: true
        }];
}

@Pipe({ name: 'pagesFilter' })
class pagesFilter implements PipeTransform {
    transform(pages: Array, [key]): string {
        return pages.hasOwnProperty(key);
    }
}

我在控制台中收到以下错误:

angular2.dev.js:23730 例外:错误:未捕获(承诺): 组件视图上的意外管道值“未定义” '投资组合'

谁能指出我做错了什么?

感谢您的帮助

【问题讨论】:

    标签: json typescript angular pipes-filters


    【解决方案1】:

    类不支持吊装。您需要在上课之前定义管道:

    @Pipe({ name: 'pagesFilter' })
    class pagesFilter implements PipeTransform {
      transform(pages: Array, [key]): string {
        return pages.hasOwnProperty(key);
      }
    }
    
    @Component({
      selector: 'portfolio',
      templateUrl: '/app/views/portfolio.html',
      styleUrls: ['../app/styles/PortfolioMobile.css', '../app/styles/PortfolioOther.css'],
      pipes: [pagesFilter],
      encapsulation: ViewEncapsulation.None
    })
    export class PortfolioComponent {
      (...)
    }
    

    更新

    你的管道应该返回一个数组而不是布尔值:

    @Pipe({ name: 'pagesFilter' })
    class pagesFilter implements PipeTransform {
      transform(pages: Array, [key]): string {
        return pages.filter(page => {
          return page.hasOwnProperty(key);
        });
    
      }
    }
    

    【讨论】:

    • 这解决了最初的问题,但现在我得到:angular2.dev.js:23730 例外:在 [pages | 中找不到不同的支持对象“false” pagesFilter: 'demo' in PortfolioComponent@0:5]
    猜你喜欢
    • 2021-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-08
    • 2017-05-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多