Angular RC 1 — узнать, когда подписка прошла успешно

Я столкнулся с некоторыми проблемами после перехода на RC1, один из которых находится в одном из моих компонентов. У меня есть служба, которая берет некоторый json из laravel API и подписывается на него, а затем внутри компонента у меня есть следующее

        import {Component, ElementRef, OnInit} from '@angular/core';
        import {ProjectsMainApi} from "../../../services/projects-main";

        declare var jQuery: any;
        declare var subscribe: any;

        import { RouteConfig, ROUTER_DIRECTIVES, ROUTER_PROVIDERS } from '@angular/router-deprecated';

        @Component({
            selector: 'projects',
            templateUrl: './app/components/Projects/list/index.html',
            directives: [ROUTER_DIRECTIVES]
        })

        export class ProjectsListComponent implements OnInit {

            elementRef: ElementRef;

            project: Object;

            constructor(elementRef: ElementRef, private _projectsmainapi: ProjectsMainApi) {
                this.elementRef = elementRef;
                this.project = this._projectsmainapi.project$;

                this._projectsmainapi.getProjectsMain();        
            }
            ngOnInit() {


                this.project.subscribe(() => {

                   alert('subscribed');

                });
            }
        }

часть, которая терпит неудачу в линиях

                this.project.subscribe(() => {

                   alert('subscribed');

                });

перед обновлением компилятор скомпилировал это без проблем, и это сработало, но после обновления я получаю эту ошибку TS2339: свойство «подписаться» не существует для типа «объект».

Мой служебный файл вообще не изменился и выложен следующим образом

    import {Http, Headers, Response} from "@angular/http"
    import {Injectable} from "@angular/core"
    import {IProjectsMain} from "../interfaces/IProjectsMain"
    import 'rxjs/Rx';
    import {Observable} from 'rxjs/Observable';
    import {Observer} from 'rxjs/Observer';
    import 'rxjs/add/operator/share';
    import 'rxjs/add/operator/map';

    @Injectable()
    export class ProjectsMainApi {

        apiUrl: string = "http://www.test.io/api/projects";

        headers: Headers = new Headers;

        project$: Observable<IProjectsMain[]>;

        private _ProjectsMainObserver: Observer<IProjectsMain[]>;

        private _dataStore: {

            project: IProjectsMain[]

        };

        constructor(private _http: Http) {

            this.headers.append('Content-Type', 'application/x-www-form-urlencoded');

            this.headers.append('X-Requested-With', 'XMLHttpRequest');

            //this.project$ = new Observable(observer => this._ProjectsMainObserver = observer).share();
            this.project$ = new Observable<IProjectsMain[]>(observer => this._ProjectsMainObserver = observer).share();
            this._dataStore = { project: [] };
        }

        public getProjectsMain() {

            this._http.get(this.apiUrl).map(response => response.json()).subscribe(data => {

                this._dataStore.project = data.project;

                this._ProjectsMainObserver.next(this._dataStore.project);

            }, error => console.log('Could not load projects.'),
                () => "doneskies");

        }

    }

Потратив день на гугление и возню с кодом, я не знаю, как я могу исправить это и заставить его скомпилироваться, поэтому теперь я надеюсь, что кто-то может знать, как решить это другим способом, т.е. мне нужно быть в состоянии сказать, когда подписка происходит, и она успешна, но из моего компонента конечный результат должен вызвать предупреждение, которое находится в моем файле компонента


person Kravitz    schedule 05.05.2016    source источник


Ответы (1)


Измените тип переменной project на Observable<any> или Observable<IProjectsMain[]>, как в вашем сервисе.

export class ProjectsListComponent implements OnInit {
    elementRef: ElementRef;
    project: Observable<any>;
...
}

Это работало раньше, потому что вы, вероятно, изменили свой tsconfig.json на ?:

"noEmitOnError": true 
person Abdulrahman Alsoghayer    schedule 05.05.2016
comment
Я назову своего первого ребенка в честь вас, добрый сэр. Блестящий материал, мне даже не нужно было редактировать мой tsconfig, но вы, вероятно, правы, я обновил его, и я не уверен, что в нем было раньше. Я новичок в angular 2, поэтому мне просто любопытно, есть ли какие-либо проблемы с безопасностью или в противном случае от приведения переменных как любых или это стандартная практика ... также просто для ловкости в моем контроллере я также добавил import {Observable} из 'rxjs/Observable'; на случай, если кто-то еще будет чесать голову, начиная - person Kravitz; 06.05.2016
comment
спасибо @ user3461985, хотя это будет очень длинное имя ;). О any Это не считается хорошей практикой из-за удобства чтения и получения предупреждений во время компиляции. Но когда вы находитесь в среде выполнения, тип объекта не будет иметь никакого значения, поскольку javascript по умолчанию не имеет проверки типов. Итак, с точки зрения безопасности, я сомневаюсь, что использование any как-то повлияет - person Abdulrahman Alsoghayer; 06.05.2016