角度:limitTo 管道不起作用

Posted

技术标签:

【中文标题】角度:limitTo 管道不起作用【英文标题】:Angular: limitTo pipe not working 【发布时间】:2017-02-23 00:25:33 【问题描述】:

我正在尝试在字符串上的 Angular2 上运行 limitTo 管道:

 item.description | limitTo : 20  

我收到以下错误:

The pipe 'limitTo' could not be found

这个管道有可能在 Angular2 中被移除了吗?

这是我的app.module

从'./limit-to.pipe'导入 TruncatePipe ;

@NgModule(
  imports: [ 
    BrowserModule,
    FormsModule,
    HttpModule,
    InMemoryWebApiModule.forRoot(InMemoryDataService),
    RouterModule.forRoot([
      
        path: '',
        redirectTo: '/home',
        pathMatch: 'full'
      ,
      
        path: 'home',
        component: GridComponent
      ,
    ])
  ],
  declarations: [ 
    AppComponent, 
    TopNavComponent, 
    GridComponent,
    TruncatePipe
  ],
  providers: [
    PinService,
  ],
  bootstrap: [ AppComponent ]
)
export class AppModule  

我正在使用管道的网格组件:

import  Component,OnInit  from '@angular/core';
import  Router    from '@angular/router';

@Component(    
    moduleId : module.id,
    selector: 'my-grid',    
    templateUrl : 'grid.component.html',
    styleUrls: [ 'grid.component.css']
)

export class GridComponent  implements OnInit


    constructor(
        private router: Router,
        private gridService: GridService) 
    

    ngOnInit(): void 
    

我的管道定义:

import  PipeTransform, Pipe   from '@angular/core';

@Pipe(
  name: 'limitToPipe'
)
export class TruncatePipe implements PipeTransform 

  transform(value: string, limit: number) : string 

    let trail = '...';

    return value.length > limit ? value.substring(0, limit) + trail : value;
  


最后是我的模板:

<div *ngFor="let item of items" class="grid-item">
  <p class="simple-item-description">
     item.description | limitToPipe :  20  
  </p>                
</div>

【问题讨论】:

limitTo 在 Angular 2 中不可用,如 in the API reference 所示。但是,您可以构建自己的管道。 【参考方案1】:

首先你需要创建一个管道。

import  Pipe, PipeTransform  from '@angular/core';

@Pipe(
  name: 'limitTo'
)
export class TruncatePipe 
  transform(value: string, args: string) : string 
    // let limit = args.length > 0 ? parseInt(args[0], 10) : 10;
    // let trail = args.length > 1 ? args[1] : '...';
    let limit = args ? parseInt(args, 10) : 10;
    let trail = '...';

    return value.length > limit ? value.substring(0, limit) + trail : value;
  

在module.ts文件中添加管道

import  NgModule       from '@angular/core';
import   TruncatePipe    from './app.pipe';

@NgModule(
  imports:      [
  ],
  declarations: [
    TruncatePipe
  ],
  exports: [ 
  ]
)

export class AppModule  

然后在绑定代码中使用管道:

 item.description | limitTo : 20  

演示plunker

【讨论】:

我试过了,我不断得到:“ [ts] 类型参数 ' moduleId: string; selector: string; templateUrl: string; pipe: typeof TruncatePipe[]; styleUrl...'不可分配给“组件”类型的参数。对象字面量只能指定已知属性,“组件”类型中不存在“管道”。导入 TruncatePipe" 您是否在模块“声明”中注入了管道?即@NgModule 在模块中添加管道而不是在组件中。 我将它添加到 NgModule,但在我的组件中不断出现以下错误:“找不到管道 'limitTo'” 检查管道名称是否为 'limitTo' 或其他任何内容。请提供您的管道源代码。【参考方案2】:

为了回答您的问题是否已被删除:是和否。 limitTo 似乎已被删除,但有一个 slice 管道与 limitTo 基本相同,可用于字符串和列表。它还使您有机会在给定的起始索引处开始限制,这很简洁。

在您的情况下,一个简单的 item.description | slice:0:20 就足够了。除非您想获得更多编写自己的管道的经验,我什至鼓励这样做;)

来源和文档:https://angular.io/docs/ts/latest/api/common/index/SlicePipe-pipe.html

【讨论】:

正是我需要的!【参考方案3】:

您可以改用ng2-truncate

它有更多的选项,例如:按单词截断,按字符截断,截断左侧(...abc)......

$ npm install ng2-truncate --save

声明

import  Component  from '@angular/core';
import  TruncateModule  from 'ng2-truncate';

@Component(
    selector: 'my-component',
    template: '<p> "123456789" | truncate : 3 </p>'
)
export class MyComponent 



@NgModule(
  imports: [ TruncateModule ],
  declarations: [ MyComponent ]
)
export class MyApp  

组件

@Component(
    ...
    template: '<p> "123456789" | truncate : 3 : "..." </p>',
    ...
)

结果:

<p>123...</p>

【讨论】:

【参考方案4】:

我添加了这段代码以使其更有意义

 item.description | slice:0:20  item.description.length > 20 ? '....read more' : '' 

显示数据被切片并包含更多隐藏的数据

【讨论】:

【参考方案5】:

限制记录的简单方法

<li *ngFor="let item of _source| slice:0:3; let ind=index;">
   item.description
</li> 


Here slice:0:3 --> 3 is the 3 records length means only first three records will be displayed.

【讨论】:

以上是关于角度:limitTo 管道不起作用的主要内容,如果未能解决你的问题,请参考以下文章

日期范围在聚合管道中不起作用,但在 find() 中起作用

多管道C程序不起作用

Angular 2 中的 JSON 管道不起作用

多次分叉后写入管道不起作用

带有连续管道的 grep 不起作用

为 onehotencoded 变量创建管道不起作用