2015-12-27 2 views
1

Я хочу создать два отдельных экземпляра из службы, как в this plunkr.AngularJS: Создание многоуровневых заводов из службы

Но, похоже, они делят своих членов. Что я делаю не так?

angular.module("App", []) 
.service("service", function() { 
    var $this = this; 
    this.number = 1; 
    var getNumber = function() { return $this.number; } 
    var setNumber = function(n) { $this.number = n; } 
    this.build = function() { 
    return { 
     getNumber: getNumber, 
     setNumber: setNumber 
    } 
    } 
} 
}) 

.factory('fac1', function(service) { 
    return service.build(); 
}) 

.factory('fac2', function(service) { 
    return service.build(); 
}) 

ответ

2

Функция build службы создает новый объект и возвращает новый объект.

angular.module("App", []) 
    .service("service", function() { 
    var number = 0; 
    var getNumber = function() { return this.number; } 
    var setNumber = function(n) { this.number = n; } 
    this.build = function() { 
     var newObj = {}; 
     number += 1; 
     newObj.number = number; 
     newObj.getNumber = getNumber; 
     newObj.setNumber = setNumber; 
     return newObj; 
    } 
    }) 

Как уже упоминалось в другой ответ, как на заводскую поставщика и службы поставщика одноэлементны. На самом деле все поставщики AngularJS являются одиночными. Но синглтон может служить «фабрикой», которая производит класс объектов.

+0

Доступ к свойствам объекта с помощью [] не рекомендуется, если только вы не помещаете внутри [] переменную. – m0meni

+0

Я получаю 'не могу получить доступ к члену undefined' при попытке использовать' this' в функции – Wonko

+0

@Wonko Не используйте '$ this'. Используйте 'this' напрямую. – georgeawg

1

Похоже, вы смущены тем, как работают фабрики и службы.

Оба завода и услуги являются одноточиями, и, кроме того, оба они делают в основном одно и то же. More reading here

fac1 и fac2 используют точно такой же экземпляр service, что означает, что обмен членом фактически ожидаемое поведение.

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

Тогда вы могли бы сделать что-то вроде:

angular.module("App", []) 
    .service("service", function() { 
    var $this = this; 

    function myClass() { 
     this.number = 1; 
    } 
    myClass.prototype.getNumber = function() { return $this.number; }; 
    myClass.prototype.setNumber = function(n) { $this.number = n; } 
    this.build = function() { 
     return new myClass(); 
    } 
    } 
}) 

, если вы не знаете, как классы работают в JavaScript вы можете взглянуть здесь: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Introduction_to_Object-Oriented_JavaScript

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

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