Подтвердить что ты не робот

Angular JS вводит новый экземпляр класса

Я хочу ввести экземпляры класса. Из этого потока похоже, что службы возвращают новый serviceArgFunction, чего я хочу. https://groups.google.com/forum/#!msg/angular/56sdORWEoqg/VxECXKbn3gsJ

Но я не могу заставить его работать. По какой-то причине, мои два экземпляра share state. Может ли кто-нибудь помочь мне выяснить, что я делаю неправильно? http://jsfiddle.net/kTjMy/5/

var Klass = function() {
    this.count = 0;
    this.getAndIncCount = function() {
        this.count += 1;
        return this.count;
    };
};

app.service('service', Klass);
4b9b3361

Ответ 1

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

app.factory('myKlass', function() {
  return Klass
});

Более просто, если Klass определяется в другом месте, вы можете использовать value:

app.value('myKlass', Klass);

В любом случае, введите его как обычно.

function CtrlA($scope, myKlass)
{
  new myKlass();
}

Смотрите этот jsFiddle.

[Изменить] См. также это сообщение в Google Группа и этот связанный пример.

Ответ 2

Чтобы было ясно, я создал немного Plunker.

У него есть Сервис и Factory. Сервис и Factory имеют значение и сеттеры и получатели.

Оба вводятся в контроллеры A и B. Если вы измените значение Сервиса в контроллере A, это изменение также займет место в контроллере B, потому что служба является Singleton.

Но когда вы изменяете значение в Factory в контроллере B, это влияет только на B, потому что изменение занимает только место в экземпляре, созданном в B.

Наслаждайтесь!

Ответ 3

Максимилиан - благодарю вас за отличный пример.

Я преобразовал это в JSFiddle, в качестве места для экспериментов с другим шаблоном проектирования, который я хотел копать. Почему все-таки работает замена типа провайдера с "service" на "factory"? Это больше похоже на то, как создается поставщик, т.е. Использует "новый", а не просто ссылается на него напрямую.

Кроме того, внутри службы есть шаблон проектирования, почему служба должна реализовать ключевое слово "this", в отличие от использования с помощью return {myAccessor: function() {return val; }}

См http://jsfiddle.net/jeffsteinmetz/XF69p/

В этом jsfiddle вы можете изменить одну строку кода (строка 23), и она все еще работает, строка кода может быть:

App.service('MyService', function() {

или

App.factory('MyService', function() {    

Почему эти обе работают?

Это больше похоже на то, как вы ссылаетесь на службу с помощью "нового"

  var myInstance = new MyFactory();

Что отличается от прямого вызова непосредственно

  MyService.getVal()

Любые angular люди должны изложить лучшие практики и рассуждения позади этого:

  • когда использовать "новое" и когда вам не нужен новый
  • зачем использовать ссылочный подход 'this' для определения вашего провайдера вместо возврата {accessorName: function}
  • Почему в приведенном выше примере работают как factory, так и службы?