Chcę rejestrować akcje w mojej aplikacji kątowej.Angular JS logowanie danych z obietnicami i przechowywaniem lokalnym
Jeśli nie mogę opublikować posta, chcę dodać artykuł do innego dziennika w magazynie lokalnym, aby przy następnym wysłaniu móc spróbować dodać te elementy.
Po wykonaniu tej czynności chcę spróbować opublikować bieżące elementy. Chcę również mieć przycisk (sync), który przechodzi przez proces bez przechodzenia przez proces dziennika akcji. aby użytkownik mógł spróbować opublikować wszystkie elementy, których wcześniej nie mógł opublikować.
Myślę o zbliżaniu się w ten sposób. na przesłanie
-dodano do lokalnego magazynu, a następnie spróbuj opublikować. (Tak, że pierwsze elementy wcześniejszych stanowisk)
na sukces
-remove artykuł z lokalnej pamięci masowej
w przypadku błędu
-Trzymaj przedmiot do lokalnego przechowywania
Jestem sprawiedliwy sposób w dół ścieżki działania, jak pokazano poniżej, jednak nie jestem pewien, czy jest to najlepszy sposób podejścia do tego.
W tej chwili mogę opublikować dane dotyczące sukcesu, ale nie można usunąć pojedynczego przedmiotu z lokalnego magazynu.
Dodałem w userService nazwie removeName, który skomentowałem w moim poniższym kodzie, ponieważ obecnie usuwa on zmienną _nameLog, a nie lokalny odnośnik do magazynu.
Ale kiedy uruchamiasz kod w codepen demo, publikujesz każdy przedmiot za każdym razem, ponieważ nie usuwam ich z powodzeniem?
Jak mogę usunąć lokalny element pamięci po sukcesie bez usuwania _namelog (ponieważ trzeba pozostać w powtórzeniu ng) lub czy jest inny sposób, w jaki powinienem się do tego zbliżyć?
<body ng-app="myApp">
<div ng-controller="MyCtrl">
<input type="text" ng-model="updatedname">
<input type="button" value="Change name" ng-click="changeName(updatedname)"/>
<br/>
Hello, {{name}}!
<ul>
<li ng-repeat="name in nameLog">{{name.value}} - {{name.time}}</li>
</ul>
<input type="button" value="sync" ng-click="syncPosts()"/>
</div>
</body>
<script>
var myApp = angular.module('myApp',[]);
myApp.factory('UserService', ['$window','$http', function($window,$http) {
var _nameLog = [];
var userService = {};
userService.name = "John";
userService.ChangeName = function (value) {
userService.name = value;
};
userService.logName = function (value) {
_nameLog.push ({
"value":value,
"time" :Date.now()
});
};
userService.removeName = function (value) {
return delete _nameLog[0];
};
userService.getNameLog = function(){
return _nameLog;
};
userService.setLS = function(key, value) {
$window.localStorage[key] = value;
},
userService.getLS = function(key, defaultValue) {
return $window.localStorage[key] || defaultValue;
};
userService.setObject = function(key, value) {
$window.localStorage[key] = JSON.stringify(value);
};
userService.getObject = function(key) {
return JSON.parse($window.localStorage[key] || '{}');
};
userService.testPost = function(myVal,myTime) {
return $http.post('http://jsonplaceholder.typicode.com/posts', {title:myVal,body:myTime,userId: 1});
};
return userService;
}]);
function MyCtrl($scope, UserService) {
$scope.name = UserService.name;
$scope.updatedname="";
$scope.changeName=function(data){
$scope.updateServiceName(data);
}
$scope.updateServiceName = function(name){
UserService.ChangeName(name);
UserService.logName(name);
$scope.name = UserService.name;
$scope.nameLog = UserService.getNameLog();
UserService.setLS('name', JSON.stringify($scope.nameLog));
getPosts();
}
$scope.syncPosts = function(){
getPosts();
}
function testPost(myVal,myTime) {
UserService.testPost(myVal,myTime)
.success(function(data, status, headers, config) {
console.log('success');
console.log(data);
//UserService.removeName();
})
.error(function(data, status, headers, config) {
console.log('error');
});
}
function getPosts(){
getObj = UserService.getObject('name');
for (var k in getObj) {
var myVal = getObj[k].value;
var myTime = getObj[k].time;
testPost(myVal,myTime);
console.log(getObj[k].value);
}
}
}
</script>
należy pamiętać, że to nie będzie działało w różnych wersjach. protokoły .. http vs. https (chyba że użyjesz jakiegoś rodzaju podkładki iframe) –
Umm, widzę, co próbujesz zrobić, ale nie jestem pewien co jest scenariuszem błędu, o którym mówisz. Dlaczego nie po prostu użyć przechwytywaczy, aby zażądać swoich próśb. W ten sposób będziesz mógł odesłać nieudane żądanie, dotyczące konkretnych scenariuszy, biorąc pod uwagę, z jakim problemem się spotkałeś. – Shouvik
Myślę, że lepszym podejściem byłoby dodanie go w lokalnym sklepie tylko wtedy, gdy błąd ... w ten sposób nie musisz ciągle robić, dodawać/usuwać .. i niektóre funkcje ponownego użycia za pomocą $ interval – harishr