Подскажите ошибки: реализовал сервис добавления и получения данных из таблицы
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, время: 06:43. |