возврат наблюдаемого от угловой службы

Это то, что я смог придумать для удаления глобальных переменных, которые автоматически создаются для объектов DOM с идентификационным значением:

function clearElementGlobals() {
    function clearItem(iden, item) {
        if (iden && window[iden] && (window[iden] === item)) {
            window[iden] = undefined;
        }
    }

    var list = document.getElementsByTagName("*");
    for (var i = 0, len = list.length; i < len; i++) {
        var item = list[i];
        clearItem(item.id, item);
        clearItem(item.name, item);
    }
}

Это получает список всех объектов в стр. Он просматривает поиск значений с идентификатором и когда для него существует значение id, и для него существует глобальная переменная, и эта глобальная переменная указывает на этот объект DOM, эта глобальная переменная имеет значение undefined. Как выясняется, браузеры также делают это же авто-глобальное для некоторых типов тегов с атрибутом имени (например, элементами формы), поэтому мы также очищаем их.

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

К сожалению, вы не можете удалить глобальные переменные в javascript, поэтому установить его в undefined - это лучшее, что можно сделать.

FYI, я пробовал делать это по-другому, где вы перечисляете глобальные переменные, которые ищут переменные, являющиеся экземпляром HTMLElement и которые имеют имя, которое соответствует идентификатору элемента, на который они указывают, но я не смог найти надежный способ перечислить глобальные переменные. В Chrome вы не можете перечислять их на объект окна, даже если вы можете получить к ним доступ через объект окна. Итак, мне пришлось пойти наоборот, получив все объекты DOM с идентификатором и поиская глобальные переменные, которые соответствуют им.

FYI, вы спросили о строгом режиме в своем вопросе. строгий режим применяется только к заданной области кода, поэтому не было бы никакого способа заставить его влиять на способ создания глобального пространства имен. Чтобы повлиять на что-то подобное, это должно было быть что-то на уровне документа до того, как документ был разобран как опция DOCTYPE или что-то в этом роде.

Предостережения с этой функцией.

  1. Запустите его, прежде чем создавать какие-либо из ваших собственных глобалов или не создавайте никаких своих глобальных глобалов с тем же именем, что и атрибут ID или name, который также указывает на этот объект DOM.
  2. Это одноразовый, не непрерывный. Если вы динамически создаете новые объекты DOM, вам придется перезапустить эту функцию, чтобы очистить все новые глобальные переменные, которые могли быть сделаны из новых объектов DOM.
  3. Глобалы заданы как неопределенные, которые немного отличаются от if их никогда не было в первую очередь. Я не могу придумать случай программирования, где это действительно имеет значение, но оно не идентично. К сожалению, вы не можете удалить глобальные переменные.
0
задан Ali Haghighi 17 January 2019 в 11:09
поделиться

1 ответ

Вот, как вы должны это сделать.

//component
import { ZoomService } from './../services/zoom.service';
import { Component, OnInit } from '@angular/core';
@Component({
    selector: 'app-home',
    templateUrl: 'home.page.html',
    styleUrls: ['home.page.scss'],
})
export class HomePage implements OnInit{
    spots: string[] = [];

    constructor(private zoom: ZoomService) {}

    ngOnInit() {
       this.zoom.dosomthing()
            .subscribe((res: string[]) => {
                this.spots = res;
                console.log(this.spots);
            });
    }
}

//service
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import * as $ from 'jquery';
@Injectable({
    providedIn: 'root'
})
export class ZoomService {
    constructor(private httpService: HttpClient) {}

    dosomthing(): Observable<string[]> {
        return this.httpService.get<string[]>('./assets/plates/plate1/spot.json');
    }
}
0
ответ дан codeepic 17 January 2019 в 11:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: