Подскажите ошибки: реализовал сервис добавления и получения данных из таблицы
C получением данных предполагаю, что всё хорошо, а вот с добавлением мне кажется реализовано не правильно - выполняю push и вызываю notify прямо в сервисе.
Нужно наверно каким-то образом передавать из сервиса в контроллер параметр, например, 'success', и делать push уже в контроллере. service.dataByCommands.js: (function(){ 'use strict'; angular .module('service.dataByCommands',[]) .factory('serviceDataByCommands', serviceDataByCommands); function serviceDataByCommands($http) { var _vm; return { name: 'Commands Service', add: function (vm) { _vm = vm; $http.post('addData.php',{genCommand:vm.newGenerationCommand, description:vm.newDescription}) .then(function(response) { vm.notify('success','Команда "' + response.data[0].command + '" успешно сохранена!'); vm.lists.push({ id: response.data[0].id, command: response.data[0].command, description: response.data[0].description, completed: response.data[0].completed }); }) .catch(function(error) { console.log(error); }); }, get: function (callback) { $http.get('getData.php') .then(function(response) { callback(response.data); }, function(error) { console.log(error); }); } } } })(); controllers.js: var vm = this; ..... serviceDataByCommands.get(function(data){ vm.lists = data; }); vm.addCommand = function() { serviceDataByCommands.add(vm); }; ..... |
okuznetsov1,
Не понимаю зачем передавать callback в get()? Там же промис через $http.get() возвращается. Просто return пишешь и в контроллере подписываешься. Передавать инстанс контроллера в сервис конкретно для этого случая не надо. Считай что сервис -- это M в MVC. В данном случае мы говорим об активной модели, которая ничего не знает ни про view, ни про controller, кроме того что он/она/они реализует интерфейс подписчика. Данные (состояние приложения) храним в сервисе, в контроллере взаимодействие с пользователем, изменение состояния на уровне сервисного слоя. |
Цитата:
..... get: function (callback) { $http.get('getData.php') .then(function(response) { // callback(response.data); }, function(error) { console.log(error); }); return 'success'; } ..... если делаю так, то в контроллер приходит undefined (поэтому реализовал через callback): ..... get: function () { $http.get('getData.php') .then(function(response) { return response.data; }, function(error) { console.log(error); }); } ..... По поводу "Передавать инстанс контроллера в сервис конкретно для этого случая не надо." Не понял, объясните по подробней. По поводу: " Считай что сервис -- это M в MVC........ " Т.е. оставляю как у меня сейчас реализовано, т.е. контроллеру знать о данной функциональности не нужно, поэтому "прячем (реализуем/оставляем)" её в сервисе, правильно вас понял? |
в сервисе реализовал так:
function serviceDataByCommands($http) { return { name: 'Commands Service', add: function (vm) { return $http.post('addData.php',{genCommand:vm.newGenerationCommand, description:vm.newDescription}); }, get: function () { return $http.get('getData.php'); } в контроллере так: serviceDataByCommands .get() .then(function(response) { vm.lists = response.data; }) .catch(function(error) { console.log(error); }); vm.addCommand = function() { serviceDataByCommands .add(vm) .then(function(response) { vm.notify('success','Команда "' + response.data[0].command + '" успешно сохранена!'); vm.lists.push({ id: response.data[0].id, command: response.data[0].command, description: response.data[0].description, completed: response.data[0].completed }); }) .catch(function(error) { console.log(error); }); }; Сейчас всё работает как я хотел. Я правильно вас понял? |
okuznetsov1,
add: function (vm) Зачем? Если тебе надо для запроса данные из контроллера newGenerationCommand и newDescription, ну так и передавай их в метод add, а не ссылку на контроллер. function serviceDataByCommands($http) { return { name: 'Commands Service', add: function (newGenerationCommand, newDescription) { return $http .post('addData.php',{genCommand: newGenerationCommand, description: newDescription}) .then(function(response){ return { id: response.data[0].id, command: response.data[0].command, description: response.data[0].description, completed: response.data[0].completed } }) }, get: function () { return $http.get('getData.php').then(function(response){ return response.data }) } serviceDataByCommands .get() .then(function(lists) { vm.lists = lists; }) .catch(function(error) { console.log(error); }); vm.addCommand = function() { serviceDataByCommands .add(vm.newGenerationCommand, vm.newDescription) .then(function(list) { vm.notify('success','Команда "' + list.command + '" успешно сохранена!'); vm.lists.push(list); }) .catch(function(error) { console.log(error); }); }; Контроллер -- самая зависимая часть в приложении. А в хорошо спроектированных системах, наиболее зависимые части должны быть минимальными, а не максимальными |
Цитата:
|
Возникла ещё одна проблема в продолжение к вышеописанному (возможно я уже подтупливаю):
Сейчас у меня реализованно так (соответственно вне рамках вызова сервиса "serviceDataByTasks" объект vm.notesContent на 54 строке является пустым (console.log(vm.notesContent);), мне нужно его каким-то образом сюда передать): function serviceDataByTasks($http) { return { name: 'Tasks Service', get: function () { return $http.get('getData.php').then(function(response){ return response.data }) } } ................................................................. function MainController ($filter, $scope, LxNotificationService, LxDialogService, serviceDataByTasks){ var vm = this; vm.dataTableThead = []; vm.dataTableTbody = []; vm.notesContent = []; serviceDataByTasks .get() .then(function(data) { vm.dataTableThead = [ { name: 'task_name', label: 'Название' }, { name: 'priority_name', label: 'Приоритет', sortable: true, sort: 'asc' }, { name: 'completed', label: 'Статус' }]; vm.dataTableTbody = data; vm.notesContent = data; .......................................................................... }) .catch(function(error) { console.log(error); }); ......................................................... console.log(vm.notesContent); } |
okuznetsov1,
Запрос же асинхронный. То есть твоя 54 строка выполнится до завершения любой асинхронной операции. |
Цитата:
function serviceDataByTasks($http) { return { name: 'Tasks Service', get: function () { return $http.get('getData.php').then(function(response){ return response.data }) } } ................................................................. function MainController ($filter, $scope, LxNotificationService, LxDialogService, serviceDataByTasks){ var vm = this; vm.dataTableThead = []; vm.dataTableTbody = []; vm.notesContent = []; vm.notesContent = serviceDataByTasks.get(); ......................................................... console.log(vm.notesContent); } |
Часовой пояс GMT +3, время: 21:06. |