如何在Angular 2模板中定义变量?

时间:2015-11-16 17:52:36

标签: angular

让我们在模板的某个地方说我正在使用:

<div *ng-for="#fooItem of foo">
    {{fooItem.bar.baz.value}}
</div>

我希望能够在循环中每次都使用{{theBaz}}而不是fooItem.bar.baz。有没有办法实现这一目标?也许某些语法允许定义任意变量?

documentation提到了涉及组件/指令设置值的用法,但显然没有更简单。

1 个答案:

答案 0 :(得分:3)

一种可能的解决方案是使用较小的Angular2 Pipe

得到最baz.ts:

import {Pipe} from 'angular2/angular2';

@Pipe({
    name: 'theBaz'
})

export class GetTheBaz {
    transform(item) {
        return item.bar.baz.value
    }
}

在您的应用中:

import {Component, bootstrap, NgFor} from 'angular2/angular2';
import {GetTheBaz} from './get-the-baz';

@Component({
    selector: 'my-app',
    directives: [NgFor],
    pipes: [GetTheBaz],
    template: `QuickApp: 
    <div *ng-for="#item of list">
        {{item|theBaz}}
    </div>
    `
})

根据您的使用情况,这可能是也可能不是一个好主意。

编辑:另外两个解决方案

查看我添加的以下代码:

  1. 列表上的管道,
  2. 一个好的ol'fashioned功能
  3. (我还在项目解决方案中包含上述管道以进行比较)

    import {Component, bootstrap, NgFor} from 'angular2/angular2';
    import {Pipe} from 'angular2/angular2';
    
    // This may not be the most efficient way, I'll do some research and edit in a moment
    var _getC = val => (val && val['a'] && val.a['b'] ) ? val.a.b['c'] : null; 
    
    
    @Pipe({
        name: 'pipeC'
    })
    export class pipeC {
        transform(val) {
            return _getC(val)
        }
    }
    
    @Pipe({
        name: 'pipeCFromList'
    })
    export class pipeCFromList {
        transform(list) {
            return list.map(_getC);
        }
    }
    
    @Component({
        selector: 'my-app',
        directives: [NgFor],
        pipes: [pipeC, pipeCFromList],
        template: `QuickApp:
        <p>pipe item:</p> 
        <div *ng-for="#item of list">
            <item [text-content]="item|pipeC"> </item>
        </div>
    
        <p>pipe list:</p>
        <div *ng-for="#num of list|pipeCFromList">
            <item [text-content]="num"> </item>
    </div>
        <p>func item:</p>
        <div *ng-for="#item of list">
            <item [text-content]="getC(item)"> </item>
    </div>
        `
    })
    
    class AppComponent {
        public getC (val) {
            return _getC(val);
        };
        list = [{a:{b:{c:1}}}]
    }
    bootstrap(AppComponent);
    

    尝试使用这些尺寸^