Typescript - широкое состояние приложения (Singleton?) - PullRequest
0 голосов
/ 27 апреля 2018

Я новичок в машинописи, и я много читал о машинописи и синглетонах, и я все еще могу заставить их работать.

У меня такая же проблема, как эта: Node.js и Typescript Шаблон Singleton: похоже, что Singleton не используется совместно пользователями Singleton .

Я тоже читал эту статью: https://fullstack -developer.academy / singleton-pattern-in-typcript / и этот: http://www.codebelt.com/typescript/typescript-singleton-pattern/

В конце концов, когда я перехожу из модуля в другой, кажется, что мой одноэлементный класс всегда находится в состоянии по умолчанию.

При вызове getInstance(), поскольку значение установлено на new Path(), мне кажется очевидным, что синглтон всегда находится в состоянии по умолчанию, но во многих онлайн-источниках (как и в предыдущих двух представленных) это способ сделать это.

Что я делаю не так? Спасибо.

Вот мой синглтон (Path.ts):

class Path{
    private static _instance: Path = new Path();
    private _nodes: NodeModel[];
    private _links: LinkModel[];

    public static getInstance(): Path{
        if(Path._instance)
            return Path._instance;
        else
            throw new Error("Path is not initialized.");
    }

    public setPath(nodes: NodeModel[], links: LinkModel[]){
        this._nodes = nodes;
        this._links = links;
    }

    public nodes(){ return this._nodes; }
  [...]
}
export = Path;

PathDefinition.ts

module PathDefinition{
    export function defaultDefinition(){
        var nodes = [
            new NodeModel(...),
            new NodeModel(...)
        ];
        var links = [
            new LinkModel(...),
            new LinkModel(...)
        ];
        Path.getInstance().setPath(nodes, links);
    }
}
export = PathDefinition;

controller.ts

module Controller{
    export function init(){
        console.log(Airflow.getInstance().nodes());
        //console.log => undefined
    }
}

EDIT

Как разработчик C #, я думал, что завершение каждого содержимого файла в «модуль» (или пространство имен, как упомянуто Paleo) было лучшим способом упорядочить мой код. После прочтения предоставленных Paleo ссылок и особенно этого: Как использовать пространства имен с внешними модулями TypeScript? , я понимаю, почему мой приведенный выше код не лучший способ сделать с Typescript.

1 Ответ

0 голосов
/ 27 апреля 2018

Вот сокращенный пример, который приводит к повторному использованию того же экземпляра вашего Path класса. Я удалил большую часть кода, чтобы показать, как все работает.

module.ts

class Path {
    public nodes: string[] = [];
}

export const PathSingleton = new Path();

const здесь будет существовать только один раз, хотя мы собираемся импортировать этот модуль в нескольких местах ...

othermodule.ts

import { PathSingleton } from './module';

PathSingleton.nodes.push('New OtherModule Node');
console.log(PathSingleton.nodes);

export const example = 1;

Мы добавили в список узлов в этом модуле ...

app.ts

import { PathSingleton } from './module';
import { example } from './othermodule';

PathSingleton.nodes.push('New Node');
console.log(PathSingleton.nodes);

const x = example;

Мы также добавляем к этому здесь.

Запуск этого простого приложения приводит к следующему выводу ...

From othermodule.js
[ 'New OtherModule Node' ]
From app.js
[ 'New OtherModule Node', 'New Node' ]

Эта последняя строка является «доказательством» того, что все взаимодействия происходят с одним и тем же экземпляром.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...