Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 使用Angular2和TypeScript将http功能移动到自己的服务中_Angularjs_Typescript_Angular_Rxjs - Fatal编程技术网

Angularjs 使用Angular2和TypeScript将http功能移动到自己的服务中

Angularjs 使用Angular2和TypeScript将http功能移动到自己的服务中,angularjs,typescript,angular,rxjs,Angularjs,Typescript,Angular,Rxjs,在与Angular 1*愉快地合作了4年之后,我现在正努力自学Angular2和打字脚本。*!无论如何,我有一个顶级组件,它创建了一个从我在另一个类中创建的类型派生的属性。使用我的组件,当调用ngOnInit()时,我将http调用我作为后端编写的一个假的REST服务。现在,当使用AngularJS编写应用程序时,我会将我的$http任务放入一个服务中,并将它们注入我的控制器中。。。我想对我的组件也这样做。这是我没有激活服务代码的组件。。。注意这些评论 import {Component, On

在与Angular 1*愉快地合作了4年之后,我现在正努力自学Angular2和打字脚本。*!无论如何,我有一个顶级组件,它创建了一个从我在另一个类中创建的类型派生的属性。使用我的组件,当调用
ngOnInit()
时,我将
http
调用我作为后端编写的一个假的REST服务。现在,当使用AngularJS编写应用程序时,我会将我的
$http
任务放入一个服务中,并将它们注入我的控制器中。。。我想对我的组件也这样做。这是我没有激活服务代码的组件。。。注意这些评论

import {Component, OnInit} from 'angular2/core';
import {RouteConfig, ROUTER_DIRECTIVES} from 'angular2/router';
import {Home} from './components/home/home';
import {UserStatus} from './types/types.ts'; // this is why my UserStatus Type is kept
import {UserData} from './services/user-data/UserData.ts'; // here is where I wish to write my sevice to perform the http tasks...
import {Http, Headers} from 'angular2/http';

@Component({
    selector: 'app', // <app></app>
    providers: [...FORM_PROVIDERS],
    directives: [...ROUTER_DIRECTIVES],
    pipes: [],
    styles: [require('./app.scss')],
    template: require('./app.html')
})

export class App {

    userStatus: UserStatus;

    constructor(public http: Http) {
        this.userStatus = new UserStatus();
    }

    ngOnInit() {

        // I really want to put this code into a seperate class and provide it as a service...
        var headers = new Headers();
        headers.append('Content-Type', 'application/json');
        this.http.get('/restservice/userstatus', {headers: headers})
            .map((data: any) => data.json())
            .subscribe(
            (data: any) => {
                this.userStatus = data;
            },
            err => console.log(err), // error
            () => console.log('getUserStatus Complete') // complete

        );

        /* I'd like to factor the above into a service kept in a diffent file like so*/
        /*

         UserData.getUserStatus().then((resp) => {
            this.userStatus = resp;
         })
         */

    }
}
现在我想把我的组件的http功能放到一个Seroperate服务中。。。我开始写下面的代码(请不要笑,我对Angular2真的很陌生)

现在我希望我可以调用服务
getUserStatus()
方法来执行HTTP数据获取,并在我的
App
组件中调用它(我使用的是AngularJS 1.x promise示例,但我知道我真的应该使用observables…我只是不知道怎么做!)


这显然是垃圾,我不知道我在做什么(Angular2的示例/教程到目前为止似乎没有那么好或实用)。有人能告诉我如何连接服务,然后在我的组件中正确调用它吗?

我喜欢这个问题,因为我也走了同样的路,不得不重构代码。 因此,RxJs observables目前的最佳实践是不从http请求返回.subscribe()方法中的json。只需绘制地图并返回即可。 你在那里做的是从它拥有的所有额外信息中剥离它

您应该返回observable,它是get()的整个实现

然后在组件端,您可以简单地订阅可观察的

export class App {
    public userStatus:any;
    // Have to inject the UserData Service it into our component here.
    constructor(public http: Http, private _userData: UserData ) {
    }

    ngOnInit() {
         this._userData.getUserStatus()
         .subscribe(
            (status) => {
              this.userStatus = status;
            },
            (err) => {
              console.log(err);
            },
            ()=>{console.log("User status complete")}
         );

        }
}

这是angular2中最好的话题之一,所以我在这里回答这个问题;)

因此,根据问题,让我们来谈谈重点

带有单独服务文件(代码)的Http请求 据我所知,这是使用单独的服务文件(http请求)的最佳实践,我们通常在服务文件中执行http请求,然后在组件文件中订阅响应。我们还使用modal(您在问题中发布的用于类型检查的typescript)。您必须通过单独的服务文件更改代码,如下所示:

userStatus.ts:

从'angular2/core'导入{Component,View};
从'angular2/Http'导入{Http,Response,RequestOptions,Header,Request,RequestMethod};
从“./types/types.ts”导入{UserStatus};//最好写在这里进行类型检查等。。。。。
@组成部分({
选择器:“应用程序服务”
})
导出类应用程序服务{
标题:标题;
请求选项:请求选项;
res:响应;
学生\类别\数组:数组=[];
构造函数(私有http:http){}
getUserStatus(url){
this.headers=新的headers();
append(“内容类型”,“应用程序/json”);
this.headers.append(“授权”、“id\u令牌或其他东西…”)
this.requestoptions=新的requestoptions({
方法:RequestMethod.Get,
url:url,
headers:this.headers
})
返回此.http.request(新请求(此.requestoptions(url)))
.map(res=>{
//在这里做你想返回组件或
返回[{status:res.status,json:res.json()}]
})
}
}
您的组件文件应如下所示:

从'angular2/core'导入{Component,OnInit};
从“angular2/ROUTER”导入{RouteConfig,ROUTER_指令};
从“./components/Home/Home”导入{Home};
从“./types/types.ts”导入{UserStatus};//这就是为什么要保留我的UserStatus类型
从“./services/user data/UserData.ts”导入{UserData};//这里是我希望编写我的服务来执行http任务的地方。。。
从'angular2/Http'导入{Http,Headers};
@组成部分({
选择器:'应用',//


希望它能帮助您并澄清一些与您的问题相关的问题!

我们是否应该删除.map()函数后的逗号?我还收到一个错误,即应用程序组件无法在UserData对象上看到getUserStatus方法?'(49,18):错误TS2339:类型“typeof UserData”上不存在属性“getUserStatus”。
import {Injectable} from 'angular2/core';
import {Http, Headers} from 'angular2/http';
import {UserStatus} from '../../types/types.ts';

@Injectable()
export class UserData {

    constructor(public http:Http) {
    }

    getUserStatus(): any {
        var headers = new Headers();
        headers.append('Content-Type', 'application/json');
        this.http.get('/restservice/userstatus', {headers: headers})
            .map((data: any) => data.json())
            .subscribe(
            (data: any) => {
                return data;
            },
            err => console.log(err), // error
            () => console.log('getUserStatus Complete') // complete
        );
    }
}
ngOnInit() {

     UserData.getUserStatus().then((resp) => {
        this.userStatus = resp;
     });

    }
getUserStatus(): any {
        var headers = new Headers();
        headers.append('Content-Type', 'application/json');
        return this.http.get('/restservice/userstatus', {headers: headers})
            .map((data: any) => data.json())
            .catch(this.handleError)
        );
    }

private handleError(error: Response) {
    // in a real world app, we may send the server to some remote logging infrastructure
    // instead of just logging it to the console
    console.error(error);
    return Observable.throw(error.json().error || 'Server error');
  }
export class App {
    public userStatus:any;
    // Have to inject the UserData Service it into our component here.
    constructor(public http: Http, private _userData: UserData ) {
    }

    ngOnInit() {
         this._userData.getUserStatus()
         .subscribe(
            (status) => {
              this.userStatus = status;
            },
            (err) => {
              console.log(err);
            },
            ()=>{console.log("User status complete")}
         );

        }
}
import {Component, View} from 'angular2/core';
import {Http, Response, RequestOptions, Headers, Request, RequestMethod} from 'angular2/http';

import {UserStatus} from './types/types.ts'; // better to write here for type checking etc.....

@Component({
    selector: 'app-service'
})
export class appService {
    headers: Headers;
    requestoptions: RequestOptions;
    res: Response;

    student_category_array: Array<UserStatus> = [];
    constructor(private http: Http) { }

    getUserStatus(url) {

        this.headers = new Headers();
        this.headers.append("Content-Type", 'application/json');
        this.headers.append("Authorization", 'id_token or some thing else....')

        this.requestoptions = new RequestOptions({
            method: RequestMethod.Get,
            url: url,
            headers: this.headers
        })

        return this.http.request(new Request(this.requestoptions(url)))
            .map(res => {
                // DO YOUR STUFF HERE whihc you want to return to component or
                return [{status: res.status, json: res.json()}]
            })
    }
}
import {Component, OnInit} from 'angular2/core';
import {RouteConfig, ROUTER_DIRECTIVES} from 'angular2/router';
import {Home} from './components/home/home';
import {UserStatus} from './types/types.ts'; // this is why my UserStatus Type is kept
import {UserData} from './services/user-data/UserData.ts'; // here is where I wish to write my sevice to perform the http tasks...
import {Http, Headers} from 'angular2/http';

@Component({
    selector: 'app', // <app></app>
    providers: [...FORM_PROVIDERS,UserStatus], //better to import FORM_PROVIDERS and basic providers at the time of bootstrapin
    directives: [...ROUTER_DIRECTIVES],
    pipes: [],
    styles: [require('./app.scss')],
    template: require('./app.html')
})

export class App implements OnInit {
    constructor(private userStatus:UserStatus){

    }

    ngOnInit(){
        this.serviceCalled();
    }

    serviceCalled(){
        userData.getUserStatus(url or path to json....)
            .subscribe(res=>{
                //get your data and CODE HERE....
                console.log(res)
            })
    }
}