Я новичок в Angular и пытаюсь понять, как это сделать ...
Как с помощью AngularJS внедрить контроллер, который будет использоваться в другом контроллере?
У меня есть следующий фрагмент:
var app = angular.module("testApp", ['']);
app.controller('TestCtrl1', ['$scope', function ($scope) {
$scope.myMethod = function () {
console.log("TestCtrl1 - myMethod");
}
}]);
app.controller('TestCtrl2', ['$scope', 'TestCtrl1', function ($scope, TestCtrl1) {
TestCtrl1.myMethod();
}]);
Когда я выполняю это, я получаю сообщение об ошибке:
Error: [$injector:unpr] Unknown provider: TestCtrl1Provider <- TestCtrl1
http://errors.angularjs.org/1.2.21/$injector/unpr?p0=TestCtrl1Provider%20%3C-%20TestCtrl1
Должен ли я даже пытаться использовать контроллер внутри другого контроллера или мне следует сделать это службой?
TestCtrl1
вместо этого вам следует превратиться в службу.Ответы:
Если ваше намерение состоит в том, чтобы получить уже созданный экземпляр контроллера другого компонента и если вы следуете подходу на основе компонентов / директив, вы всегда можете
require
использовать контроллер (экземпляр компонента) из другого компонента, который следует определенной иерархии.Например:
Теперь использование этих компонентов может быть примерно таким:
Есть много способов настроить require .
Старый ответ:
Вам нужно внедрить
$controller
службу, чтобы создать экземпляр контроллера внутри другого контроллера. Но имейте в виду, что это может привести к некоторым проблемам с дизайном. Вы всегда можете создавать повторно используемые сервисы, которые следуют единой ответственности, и вставлять их в контроллеры по мере необходимости.Пример:
В любом случае вы не можете вызвать,
TestCtrl1.myMethod()
потому что вы прикрепили метод к,$scope
а не к экземпляру контроллера.Если вы используете контроллер совместно, то всегда будет лучше: -
и при употреблении делаем:
В первом случае это действительно
$scope
ваша модель представления, а во втором - сам экземпляр контроллера.источник
var testCtrl1ViewModel = $scope.$new();
бытьvar testCtrl1ViewModel = $rootScope.$new();
? см .: docs.angularjs.org/guide/controller @PSLЯ предлагаю вам задать вопрос о том, как внедрять службы в контроллеры. Толстые сервисы с тонкими контроллерами - хорошее практическое правило, иначе говоря, просто используйте контроллеры, чтобы прикрепить ваш сервис / фабрику (с бизнес-логикой) к вашим представлениям.
Контроллеры собирают мусор при изменении маршрута, поэтому, например, если вы используете контроллеры для хранения бизнес-логики, которая отображает значение, вы потеряете состояние на двух страницах, если пользователь приложения нажмет кнопку возврата браузера.
Вот рабочая демонстрация фабрики, внедренной в два контроллера.
Кроме того, я бы посоветовал прочитать это руководство по услугам / фабрикам.
источник
Нет необходимости импортировать / вводить ваш контроллер в JS. Вы можете просто ввести свой контроллер / вложенный контроллер через свой HTML. У меня это сработало. Подобно :
источник
Лучше всего это работает в моем случае, когда TestCtrl2 имеет собственные директивы.
Это дает мне сообщение об ошибке внедрения scopeProvider.
На самом деле это не работает, если у вас есть директивы в TestCtrl1, у этой директивы фактически другая область видимости, чем у созданной здесь. В итоге вы получите два экземпляра TestCtrl1.
источник
Лучшее решение: -
// Здесь вы получили первый вызов контроллера, но не выполнили его
источник
вы также можете использовать
$rootScope
для вызова функции / метода 1-го контроллера из второго контроллера, например,источник
используйте машинописный текст для написания кода, потому что он объектно-ориентированный, строго типизированный и простой в обслуживании кода ...
для получения дополнительной информации о типах нажмите здесь
Вот один простой пример, который я создал для обмена данными между двумя контроллерами с помощью Typescript ...
}
источник