2016-04-07 7 views
0

Plunker (Вероятно, объясняет проблему без моего описания ниже)AngularJS: множественные Фабрика экземпляры любого Прототипа наследование

У меня есть следующие построить в моем угловом-App (также см Angular Services для ссылок):

Я использую a Factory BaseService, который выполняет несколько функций. Я определяю эти функции на BaseService.prototype, чтобы они были публичными позже (также см. Ссылку выше).

Частные переменные объявляются с использованием ключевого слова var.

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

Есть ли наилучшая практика для предотвращения этого?

Если нет - можете ли вы предложить решение (даже если оно требует удаления частных переменных)?

ответ

1

Вы должны использовать this вместо глобальной переменной, updated plunkr.

+0

в конструктор я хранится 'this' к переменной' '' обслуживания, поскольку this' относится к неправильному контексте при использовании в других объектов, вложенных друг в друга функции или угловые . для всех циклов. Очевидно, это не решает мою проблему, потому что переменная 'service' указывает на неправильное местоположение также после следующего вызова конструктора. Как я могу надежно вызывать функции моей фабрики, когда я не могу получить доступ к контексту через 'this' и не сохранять мой контекст в переменной? –

+0

@ HW Я точно не знаю, что именно вы пытаетесь сделать, но цикл работает отлично, см. Этот plunkr: http://plnkr.co/edit/56oXXvl75zH4mTfAqMsd?p=preview, оба угловые.forEach и ngRepeat работают нормально –

+0

Я использовал 'angleular.foreach' в другом контексте (вы можете передать контекст в качестве третьего параметра). Таким образом, использование 'angleular.foreach' на заводе, но в другом контексте, не позволяет мне выполнять функции моей фабрики. Это было не обязательно, хотя и я мог бы переписать свой код - казалось бы, был плохой стиль в любом случае :) –

1

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

var privateVars = {}; // has contained private vars for each instance 
    var baseServiceId=0; // unique id assigned to each instance 

    var BaseService = function(initval){ 
    this.baseServiceId = ++baseServiceId; 
    privateVars[this.baseServiceId] = {"storedVal":initval}; 
    }; 

    BaseService.prototype.plusone = function(){ 
    pv = privateVars[this.baseServiceId].storedVal; 
    privateVars[this.baseServiceId].storedVal = pv+1; 
    }; 
    BaseService.prototype.getVal = function(){ 
    return privateVars[this.baseServiceId].storedVal; 
    }; 

Вот обновленный plunkr: http://plnkr.co/edit/56oXXvl75zH4mTfAqMsd?p=preview

+0

кажется немного взломанным, но мне это нравится. Путь лучше, чем отсутствие личных переменных;) –

+0

lol, это немного хакерский, особенно для вашего использования. Я придумал это, когда я создавал фабрику, которую я намеревался использовать в качестве кэша для поиска. Мне не нужно было хранить данные конфиденциально, мне просто нужен способ поиска по всем экземплярам! – xrgb

Смежные вопросы