Angular2从Odata控制器获取数据

时间:2016-08-10 20:48:56

标签: angular typescript odata

第一次提问......长期读者/潜伏者...... 我正在尝试学习angular2但是我从odata控制器获取数据时遇到了一些麻烦。我有一个简单的角度2应用程序,我试图将从odata控制器返回的一些数据加载到html中的列表元素。
这是我的angular2界面:

interface Menu {
    id: number;
    name: string;
    route: string;
    decorator: string;
    description: string;
    OldTableId: string;
    TableName: string;
}

这是我的打字稿/ Angular 2组件文件:

    import {
    ROUTER_DIRECTIVES,
    Http,
    Observable,
    MenuService,
    Component, OnInit
} from './index.ts';

@Component({
    selector: 'sidebar-menu',
    template: require('./sidebar-menu.html'),
    directives: [...ROUTER_DIRECTIVES],
    providers: [MenuService]
})
export class SidebarMenu {
    public menus: Menu[];
    public menu2s: Menu[];
    constructor(private _menuService: MenuService) {
    }
    ngOnInit() {
        this._menuService.getMenus()
            .subscribe((menus) => {
                this.menus = menus;
                console.log(val);
               },
            (err) => {
                console.log(err);
                }
            );
   }
}

这是我在angular 2组件的init中调用的angular2服务(menuService):

import { Http, Response, Observable, Injectable} from './index.ts'

@Injectable()
export class MenuService {

    constructor(private _http: Http) { }

    getMenus() {
        //return this._http.get('/api/Menu/Menus') - api works fine
        return this._http.get('http://localhost:64157/odata/OldTables')
            .map((response: Response) => response.json())

            .catch(this._handleError);

    } _handleError(err: any) {
        //TODO - Give user a nice error message.
        console.log(err);
        return Observable.throw(err);
    };
    }

}

我的HTML:

<ul class='nav navbar-sidebar'>
    <li>test</li>
    <li>
        <a [routerLink]="['/home']" class="router-link" [routerLinkActive]="['active']">
            <span class='glyphicon glyphicon-home'></span> Home
        </a>
    </li>
    <li *ngFor="let menu of menus" >
        <a [routerLink]="menu.name" class="router-link" [routerLinkActive]="['active']">
            <span class='glyphicon glyphicon-th-list {{menu.decorator}}'></span> {{menu.name}}
        </a>
    </li>
</ul>

我的问题是,当我使用API​​控制器时,这是有效的。现在我创建了一个odata控制器。当我从组件的init console.log(val);将其记录到控制台时,我可以在浏览器中看到这些数据。但我不能在屏幕上看到这个。最后我想使用html页面的<li *ngFor="let menu of menus" >中的数据。如何获取odata控制器数据?我读过的所有内容都引用了web api。

编辑:我正在添加我的odata控制器返回的数据样本。

   {
      "odata.metadata":"http://localhost:64157/odata/$metadata#OldTables","value":[
        {
          "OldColumns@odata.navigationLinkUrl":"http://localhost:64157/odata/OldTables(15252)/OldColumns","OldTableId":15252,"TableName":"addbook"
        },{
          "OldColumns@odata.navigationLinkUrl":"http://localhost:64157/odata/OldTables(15253)/OldColumns","OldTableId":15253,"TableName":"adj01"
        },{
          "OldColumns@odata.navigationLinkUrl":"http://localhost:64157/odata/OldTables(15254)/OldColumns","OldTableId":15254,"TableName":"allcmy201"
        },{
          "OldColumns@odata.navigationLinkUrl":"http://localhost:64157/odata/OldTables(15255)/OldColumns","OldTableId":15255,"TableName":"allfut"
        }
      ]
    }

1 个答案:

答案 0 :(得分:2)

我上面的代码工作了,我只是忘了引用&#34;值&#34;返回的数据。 更新的TS /组件代码:

export class SidebarMenu {
    public menus: Menu[];

    constructor(private _menuService: MenuService) {
    }
    ngOnInit() {
        this._menuService.getMenus()
            .subscribe((menus) => {
                this.menus = menus.value;
                console.log(val.value[0]);
               },
            (err) => {
                console.log(err);
                }
            );
   }
}

然后将我的html修改为以下内容:

<ul>
    <li *ngFor="let menu of menus">
        <a [routerLink]="menu.OldTableId" class="router-link" [routerLinkActive]="['active']">
            <span class='glyphicon glyphicon-th-list {{menu.OldTableId}}'></span> {{menu.TableName}}
        </a>
    </li>
</ul>