Как реализовать динамическую функцию в Angular и UI-Router на основе состояний?
Контекст:
Я использую Angular и UI-роутер...
У меня есть родительский контроллер "ParentCtrl" с шаблоном "ParentTempl".
В ParentTempl есть представление для 2 состояний: добавление и редактирование.
Я хочу вызвать функцию из ParentCtrl "abstractUpdate", которая меняет свое поведение в зависимости от того, какое состояние активно.
Текущий код:
app.config(function($stateProvider, $urlRouterProvider) {
$stateProvider
.state('add', {
template: "...",
abstractUpdate = function(object){
// do add things
}
})
.state('edit', {
template: "...",
abstractUpdate = function(object){
// do edit things
}
});
}
app.controller('ParentCtrl', function ($scope, $state) {
$scope.click = function(obj){
$state.current.abstractUpdate(obj);
}
}
Вопрос:
Текущая версия работает, но вы думаете, что это лучшее решение? Какие-либо предложения?
2 ответа
Обычно вы используете фабрику или сервис для чего-то подобного. Таким образом, вы не забиваете свою маршрутизацию логикой приложения. Вы могли бы просто ввести $state
на ваш завод / службу, чтобы вы могли обрабатывать вещи в зависимости от состояния, в котором вы находитесь:
angular.module('myApp').factory('MyService', [
'$state',
function ($state) {
return {
myMethod: function (obj) {
if (this.hasOwnProperty($state.current.name)) {
this[$state.current.name](obj);
}
},
add: function (obj) {
// do stuff
return obj;
},
edit: function (obj) {
// do stuff
return obj;
}
}
}
]);
Теперь вы можете использовать свой сервис с любого контроллера, который вам нужен, просто введите его:
angular.module('myApp').controller('myController', [
'$scope',
'MyService',
function ($scope, MyService) {
$scope.obj = {};
$scope.obj = MyService.myMethod(obj);
}
]);
Было бы более понятно иметь две отдельные функции, каждая из которых выполняет свои отдельные задачи. Это лучшая привычка в программировании, IMO.
Вы можете создать контроллер для каждого из ваших дочерних представлений и при этом иметь ParentCtrl
как родитель для каждого. Каждый дочерний контроллер может иметь свой собственный обработчик щелчков, который вызывает метод "edit" или "new" для родительского контроллера (если только не имеет смысла размещать этот код полностью или частично на каждом дочернем контроллере).