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);
Ответы
Ответ 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, так и службы?