AngularJS: поделиться общей фабрикой для создания нового объекта

0

Мое приложение имеет два пути выполнения.

Root
 |
 |---Tool1 --> T1Page 1
 |         --> T1Page 2
 |
 |---Tool2 --> T2Page 1
 |         --> T2Page 2
 |
 |----Factory (F)

Здесь T1Page2 и T2Page2 имеют аналогичные элементы пользовательского интерфейса, и я определил для этого завод. Теперь проблема в том, что если пользователь сначала запускает Tool1, а затем переходит к Tool2, в T2Page2 он отображает значения, выбранные в T1Page2. Это, очевидно, из-за однотонной инъекции в контроллер. Как я могу убедиться, что Angular возвращает новый заводский объект, когда пользователь приходит к T2Page2.

Одним из решений, о котором я могу думать, является добавление метода очистки на заводе и вызов его всякий раз, когда пользователь запускает T2Page2. Но это не очень хорошо для меня.

завод

(function () {
var serviceId = 'setUp';
angular.module('app').factory(serviceId , ['common', 'datacontext']);
function setUp(common,datacontext){
var vm = this;
vm.name='';
vm.address='';
return init();

 function init() {
      return vm;
  }
}
}());

Контроллер T1Page2 1

(function () {    
    var controllerId = 'T1Page2';
    angular.module('app').controller(controllerId, ['common', 'datacontext', 'setUp', T1Page2]);

function T1Page2(common, datacontext, setup) {
   //code omitted
  }
}());

Контроллер T2Page2 2

(function () {    
    var controllerId = 'T2Page2';
    angular.module('app').controller(controllerId, ['common', 'datacontext', 'setUp', T2Page2]);

function T2Page2(common, datacontext, setup) {
   //need a new setUp object here. 
   // rest of the code omitted
  }
}());
Теги:
angularjs-factory

1 ответ

0

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

Решение 1

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

Пример обслуживания:

angular.module('app').service('MyService',
  function () {
    this.name = '';
    this.address = '';
  }
]);

Использование службы в контроллере (например)

$scope.myService = new MyService();

Решение 2

Создайте 2 фабрики. Один завод для Tool1 и другой для Tool2.

Решение 2 может быть проще в вашем случае, поскольку вы хотите, чтобы служба (используемая в общем смысле здесь) использовалась одной группой страниц, а вторая группа страниц нуждалась в другом постоянном объекте состояния.

  • 0
    @sflectche спасибо. Я попробую первое решение, в противном случае я буду дублировать много кода.
  • 0
    если я не внедряю и не использую $ scope.service = new MyService () '; это говорит, что myService не определен. Если я внедряю myService, он говорит: «Объект не является функцией».
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню