 
			
				15.03.2017, 15:51
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Аспирант 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 02.11.2016 
					
					
					
						Сообщений: 65
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
			
			 
				Подскажите ошибки: реализовал сервис добавления и получения данных из таблицы
			 
			
		
		
		
		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, 15.03.2017 в 16:00.
				Причина: переименовал переменную
				
			
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				15.03.2017, 18:42
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 18.05.2011 
					
					
					
						Сообщений: 1,207
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
		
		
		 okuznetsov1, 
Не понимаю зачем передавать callback в get()? Там же промис через $http.get() возвращается. Просто return пишешь и в контроллере подписываешься. Передавать инстанс контроллера в сервис конкретно для этого случая не надо. 
 
Считай что сервис -- это M в MVC. В данном случае мы говорим об активной модели, которая ничего не знает ни про view, ни про controller, кроме того что он/она/они реализует интерфейс подписчика. Данные (состояние приложения) храним в сервисе, в контроллере взаимодействие с пользователем, изменение состояния на уровне сервисного слоя. 
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				15.03.2017, 19:41
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Аспирант 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 02.11.2016 
					
					
					
						Сообщений: 65
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	
		
			Сообщение от destus
			 
		
	 | 
 
	
		okuznetsov1, 
Не понимаю зачем передавать callback в get()? Там же промис через $http.get() возвращается. Просто return пишешь и в контроллере подписываешься.
	 | 
 
	
 
 return работает только если я пишу его таким образом, т.е. не внутри $http.get:
.....
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........ "
 
Т.е. оставляю как у меня сейчас реализовано, т.е. контроллеру знать о данной функциональности не нужно, поэтому "прячем (реализуем/оставляем)" её в сервисе, правильно вас понял?  
		
	
		
		
		
		
		
		
	
		
			
			
	
			
			
			
			
			
				 
			
			
			
			
			
			
				
			
			
			
		 
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				15.03.2017, 21:36
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Аспирант 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 02.11.2016 
					
					
					
						Сообщений: 65
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		в сервисе реализовал так: 
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);
                    });        
        };
Сейчас всё работает как я хотел. Я правильно вас понял?  
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				16.03.2017, 07:03
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 18.05.2011 
					
					
					
						Сообщений: 1,207
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		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);
                    });        
        };
Контроллер -- самая зависимая часть в приложении. А в хорошо спроектированных системах, наиболее зависимые части должны быть минимальными, а не максимальными  
		
	
		
		
		
		
		
		
	
		
			
			
	
			
			
			
			
			
				 
			
			
			
			
			
			
				
			
			
			
		 
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				22.03.2017, 16:27
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Аспирант 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 02.11.2016 
					
					
					
						Сообщений: 65
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	
		
			Сообщение от destus
			 
		
	 | 
 
	
		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);
                    });        
        };
 
 
Контроллер -- самая зависимая часть в приложении. А в хорошо спроектированных системах, наиболее зависимые части должны быть минимальными, а не максимальными
	 | 
 
	
 
 Спасибо, я понял вас, принял к сведению  
		
	
		
		
		
		
		
		
	
		
			
			
	
			
			
			
			
			
				 
			
			
			
			
			
			
				
			
			
			
		 
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				22.03.2017, 16:38
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Аспирант 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 02.11.2016 
					
					
					
						Сообщений: 65
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		Возникла ещё одна проблема в продолжение к вышеописанному (возможно я уже подтупливаю): 
Сейчас у меня реализованно так (соответственно вне рамках вызова сервиса "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, 22.03.2017 в 16:50.
				Причина: больше редактирований не будет, все улучшения сообщения произвёл
				
			
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				22.03.2017, 18:31
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 18.05.2011 
					
					
					
						Сообщений: 1,207
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
		
		
		 okuznetsov1, 
 Запрос же асинхронный. То есть твоя 54 строка выполнится до завершения любой асинхронной операции. 
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				22.03.2017, 21:59
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Аспирант 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 02.11.2016 
					
					
					
						Сообщений: 65
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	
		
			Сообщение от destus
			 
		
	 | 
 
	
		okuznetsov1, 
 Запрос же асинхронный. То есть твоя 54 строка выполнится до завершения любой асинхронной операции.
	 | 
 
	
 
 Можно ли переделать таким вот образом (или в данном случае в сервисе уже нет смысла и нужно сразу вызывать  $http.get() ):
 
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);
        }
 
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
 
 |  
  |