【发布时间】:2016-01-16 17:24:45
【问题描述】:
我需要绑定来自服务的模板数据变量。服务使用 HTTP 以 JSON 格式检索数据。我得到了正确的数据,但是因为请求是如此异步返回的服务总是未定义的。
如何将异步数据出售到模板中?不使用回调?
应用组件:
import {Component} from 'angular2/core';
import {RouteConfig, Router, ROUTER_DIRECTIVES} from 'angular2/router';
import {SystemComponent} from "./system.component";
import {MenuProvider} from "./providers/menuprovider";
import {Menu} from "./entity/menu";
import {Http, Headers, HTTP_PROVIDERS} from 'angular2/http';
@Component({
selector: 'app',
templateUrl: '/templates/layout',
directives: [ROUTER_DIRECTIVES]
})
@RouteConfig([
{
path: '/',
redirectTo: ['/System'],
useAsDefault: true
},
{
path: '/-1/...',
name: 'System',
component: SystemComponent
}
])
export class AppComponent {
menusItems:Array<Menu>;
constructor(router: Router, menuProvider:MenuProvider){
this.menusItems = menuProvider.getMenuItems(1);
router.navigate(['/System']);
}
}
菜单提供者:
import {Menu} from "../entity/menu";
import {IndexedCollection} from "../collections/IndexedCollection";
import {Injectable} from 'angular2/core'
import {Http, Headers, HTTP_PROVIDERS} from 'angular2/http';
@Injectable()
export class MenuProvider{
_menuItems:Array<Menu>;
private _http:Http;
constructor(http:Http){
this._http = http;
}
getMenuItems(shopId:number){
this.loadMenuForShopId(shopId);
return this._menuItems;
}
private loadMenuForShopId(shopId:number){
var base = this;
this._http.get('/services/menu/list/' + shopId)
.subscribe(
function(res){
res = res.json();
for(index in res['menuItems']){
var menu = res['menuItems'][index];
base._menuItems.push(new Menu(menu['url'], menu['name']));
}
}
);
}
}
菜单实体:
export class Menu{
private _url;
private _name;
constructor(url:string,name:string){
this._url = url;
this._name = name;
}
get url() {
return this._url;
}
get name() {
return this._name;
}
}
模板:
<ul>
<li *ngFor="#menu of menusItems">
<a>{{menu.getName()}}</a>
</li>
</ul>
【问题讨论】:
-
你可以返回 observable 并在 Controller 中订阅它。 observable 将立即交付,您可以选择在信息返回控制器后如何处理。
标签: angular