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);
}
|
|
|
|