Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 15.03.2017, 15:51
Аспирант
Отправить личное сообщение для okuznetsov1 Посмотреть профиль Найти все сообщения от okuznetsov1
 
Регистрация: 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. Причина: переименовал переменную
Ответить с цитированием
  #2 (permalink)  
Старый 15.03.2017, 18:42
Аватар для destus
Профессор
Отправить личное сообщение для destus Посмотреть профиль Найти все сообщения от destus
 
Регистрация: 18.05.2011
Сообщений: 1,207

okuznetsov1,
Не понимаю зачем передавать callback в get()? Там же промис через $http.get() возвращается. Просто return пишешь и в контроллере подписываешься. Передавать инстанс контроллера в сервис конкретно для этого случая не надо.

Считай что сервис -- это M в MVC. В данном случае мы говорим об активной модели, которая ничего не знает ни про view, ни про controller, кроме того что он/она/они реализует интерфейс подписчика. Данные (состояние приложения) храним в сервисе, в контроллере взаимодействие с пользователем, изменение состояния на уровне сервисного слоя.
Ответить с цитированием
  #3 (permalink)  
Старый 15.03.2017, 19:41
Аспирант
Отправить личное сообщение для okuznetsov1 Посмотреть профиль Найти все сообщения от okuznetsov1
 
Регистрация: 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........ "

Т.е. оставляю как у меня сейчас реализовано, т.е. контроллеру знать о данной функциональности не нужно, поэтому "прячем (реализуем/оставляем)" её в сервисе, правильно вас понял?
Ответить с цитированием
  #4 (permalink)  
Старый 15.03.2017, 21:36
Аспирант
Отправить личное сообщение для okuznetsov1 Посмотреть профиль Найти все сообщения от okuznetsov1
 
Регистрация: 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);
                    });        
        };


Сейчас всё работает как я хотел. Я правильно вас понял?
Ответить с цитированием
  #5 (permalink)  
Старый 16.03.2017, 07:03
Аватар для destus
Профессор
Отправить личное сообщение для destus Посмотреть профиль Найти все сообщения от destus
 
Регистрация: 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);
                    });        
        };


Контроллер -- самая зависимая часть в приложении. А в хорошо спроектированных системах, наиболее зависимые части должны быть минимальными, а не максимальными
Ответить с цитированием
  #6 (permalink)  
Старый 22.03.2017, 16:27
Аспирант
Отправить личное сообщение для okuznetsov1 Посмотреть профиль Найти все сообщения от okuznetsov1
 
Регистрация: 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);
                    });        
        };


Контроллер -- самая зависимая часть в приложении. А в хорошо спроектированных системах, наиболее зависимые части должны быть минимальными, а не максимальными
Спасибо, я понял вас, принял к сведению
Ответить с цитированием
  #7 (permalink)  
Старый 22.03.2017, 16:38
Аспирант
Отправить личное сообщение для okuznetsov1 Посмотреть профиль Найти все сообщения от okuznetsov1
 
Регистрация: 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. Причина: больше редактирований не будет, все улучшения сообщения произвёл
Ответить с цитированием
  #8 (permalink)  
Старый 22.03.2017, 18:31
Аватар для destus
Профессор
Отправить личное сообщение для destus Посмотреть профиль Найти все сообщения от destus
 
Регистрация: 18.05.2011
Сообщений: 1,207

okuznetsov1,
Запрос же асинхронный. То есть твоя 54 строка выполнится до завершения любой асинхронной операции.
Ответить с цитированием
  #9 (permalink)  
Старый 22.03.2017, 21:59
Аспирант
Отправить личное сообщение для okuznetsov1 Посмотреть профиль Найти все сообщения от okuznetsov1
 
Регистрация: 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);
        }
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Через ajax отправить много данных из таблицы на сервер Heger jQuery 3 29.08.2012 18:51
Двойная Фильтрация данных таблицы David0707 Общие вопросы Javascript 0 19.03.2012 13:00
Изменение окраски строк таблицы, исходя из данных? Space-06 Events/DOM/Window 4 14.02.2012 21:32