有个性的企鹅 發表於 2019-12-17 20:17:00

angular自定义管道【pipe】

<p>链接:https://juejin.im/post/58db5b55128fe1006cdf0bb3</p>
<p>angular中,管道的使用</p>
<p>管道一般适用于Mustache语法 的双向数据内, eg{{item |json}}&nbsp; 该例子采用了内置的JsonPipe管道。</p>
<p>若要带参数 则{{item |slice:0:4}&nbsp; 管道后面冒号跟随的就是参数</p>
<p>多重管道如何调用 {{item |slice:0:4|uppercase}}</p>
<p>&nbsp;</p>
<p>如何书写一个自定义管道</p>
<p>1 自定义管道必须依赖这2个</p>
<p>  import { Pipe, PipeTransform } from '@angular/core';</p>
<p>2 // 管道装饰符 ,name就是管道名称</p>
<p>  @Pipe ({name: 'name'})</p>
<p>&nbsp;</p>
<p>3 export class PipeNamePipe implements PipeTransform {</p>
<p>  // value: 传入的值</p>
<p>  // ... args: 参数集合(用了...拓展符),会把数组内的值依次作为参数传入 参数可改成常规的写法(value: any ,start: number, end: number)</p>
<p>  transform(value: any,&nbsp; ...args:any[]) : any {}</p>
<p>}</p>
<p>例1&nbsp;实现一个切割字符串然后拼接<code>...</code>的管道【用于渲染数据过长截取】</p>
<p>import { Pipe, PipeTransform } from '@angular/core';</p>
<p>@Pipe( {</p>
<p>  name: 'SliceStr'</p>
<p> })</p>
<p>export class SliceStrPipe implements PipeTransform {</p>
<p>  </p>
<div>
<div><span class="hljs-comment">/** * 截图字符串字符 * option(start,end,[+str]) */ <span class="hljs-comment">// start和end及extraStr后面都跟随了一个问好,代表这个为可选参数而不是必选的 <span class="hljs-comment">// 功能就是给出截图的启示,然后是否拼接你自定义的字符串(...)等</span></span></span></div>
  transform(value: string, start?: number, end?: number, extraStr: string) :string {</div>
<div>    if (value) {</div>
<div>      if (typeof start === 'number' &amp;&amp; typeof end === 'number') {</div>
<div>        if (value.length &gt; end &amp;&amp; extraStr &amp;&amp; typeof extraStr === 'string') {</div>
<div>          return value.slice(start, end) + extraStr,toString();</div>
<div>        } else {</div>
<div>          return value.slice(start, end);</div>
<div>        }</div>
<div>      } else {</div>
<div>        return value.slice(start, end)</div>
<div>      }</div>
<div>    } else {</div>
<div>      return value;</div>
<div>    }<br><br></div>
<p>}</p>
<p>&nbsp;</p>
<p>模仿angular中的 keyvalue管道:</p>
<p>import {Pipe, PipeTransform} from '@angular/core';</p>
<p>/*</p>
<p>&nbsp;Convert Object to array of keys.</p>
<p>*/</p>
<p>@Pipe({</p>
<p>  name: 'appProperties'</p>
<p>})</p>
<p>export class PropertiesPipe implements PipeTransform {</p>
<p>  transform(value: {}): string[] {</p>
<p>    if (!value) {</p>
<p>      return [];</p>
<p>    }</p>
<p>    return Object.keys(value);</p>
<p>  }</p>
<p>}</p>
<p>&nbsp;</p>
<p>在模板中使用: &lt;div *ngFor="let property of response |appProperies&gt;</p>
<p>        &lt;div *ngFor="let item of response"&gt; {{item.dosomething}}&lt;/div&gt;</p>
<p>      &lt;/div&gt;</p>
<p>&nbsp;</p>
<p>如何是一个自定义管道生效</p>
<p>// 功能管道 , 单一引入生效</p>
<p>import { SliceStrPipe } from './SliceStr/slice-str.pipe';</p>
<p>@NgModule ( {</p>
<p>  imports: ,'</p>
<p>  declarations: , //&nbsp; 管道生效必须放到declarations里面</p>
<p>})</p>
<p>// 模块引入</p>
<p>写一组管道,放到自定义模块中,最后导出,然后在其他模块引入这个模块就能直接使用</p>
<p>import ..........</p>
<p><br>const pipe =[<br>IsCitizenIDPipe,<br>IsEmailPipe,<br>IsEnhancePasswordPipe,<br>IsFixedPhonePipe,<br>IsLicensePipe,<br>IsMobilePhonePipe,<br>IsNormalPasswordPipe,<br>IsNumberPipe,<br>IsUsernamePipe,<br>SliceStrPipe,<br>TimeDifferencePipe,<br>TransDatePipe,<br>ThousandSeparationPipe<br>];</p>
<p>@NgModule( {<br>imports: [<br>    CommonModule<br>],<br>declarations: [<br>    MitPipeComponent,<br>    ...pipe,<br>],<br>exports: [ ...pipe ],<br>schemas: [ CUSTOM_ELEMENTS_SCHEMA ]<br>})<br>export class MitPipeModule { }</p>
<p>&nbsp;</p>
<p>// ----- 引入module</p>
<p>// 管道 -- 把MitPipeModule丢到imports里面就行了<br>import { MitPipeModule } from '../../../../../widgets/mit-pipe/mit-pipe.module';</p>
<p>&nbsp;</p><br><br>
来源:https://www.cnblogs.com/xiaogao6681/p/12056271.html
頁: [1]
查看完整版本: angular自定义管道【pipe】