AngularJS pushing/updating 新数据 (likes/dislikes) 到 API 使用 PUT
AngularJS pushing/updating new data (likes/dislikes) to API using PUT
我正在尝试创建一个计算啤酒点赞数的应用程序!这将更新存储啤酒的 API,然后使用 PUT 方法更新 API 和 angularJS 视图上的点赞数。每次单击类似内容时,我都能使视图正常工作。我不确定为什么我的 PUT 方法继续 return 404 而不会更新 API。请参阅下面的代码了解我的 put 方法。为此,我还包括了我的 JS 和 HTML。我觉得我很接近,但不知道如何让 "likes" 在 API 上更新。先感谢您!!我认为我将不正确的数据传递给 PUT 方法。
HTML:
<div ng-app="beerApp" ng-controller="BeerController" class="jumbotron">
<div class="all-beer">
<div class="single-beer" ng-repeat="beer in allBeer">
<div>{{beer.name}}</div>
<div>{{beer.likes}}</div>
<button ng-click="decrease(beer)">X</button>
<button ng-click="increase(beer)"></button>
</div>
</div>
</div>
JS:
angular.module('beerApp', []).controller('BeerController', function($scope, $http) {
$scope.allBeer = [];
$scope.beerSum = function() {
$http({
method: 'GET',
url: /api/beers
}).
then( function(response) {
if(typeof response === 'object') {
var dataArr = response.data;
for (var i = 0; i < dataArr.length; i++) {
var beer = dataArr[i];
$scope.allBeer.push(beer);
}
} else {
return;
}
}, function(error) {
console.log('i am an error', error);
})
};
$scope.beerSum();
$scope.increase = function(beer){
var newLikes = beer.likes++;
$http({
method: 'PUT',
url: '/api/beer/',
data: JSON.stringify($scope.allBeer.likes),
}).then(function successCallback(response) {
console.log("Updated!");
}, function errorCallback(response) {
console.log("not updated")
});
};
首先,您缺少一些 http api 的语法。其次,您在不存在的数组上调用 属性 。第三,由于您的逻辑,您的 api 将无法工作。你有一系列啤酒,你想增加对单一啤酒的喜欢。在接受啤酒的服务器上创建一个方法,服务器将获取该啤酒并将其喜欢数增加 1,然后保存到数据库或其他任何地方。
根据您使用的服务器,您有两种选择。
您可以简单地在 /api/beers
定义一个命令,并将服务器配置为接受一个对象并将该对象 ID 用于服务器更新。如果是这种情况,我建议创建此端点 /api/beers/update
并将其设为 POST,并将对象传递给它,然后在此命令中执行所有更新逻辑。
或者例如 Microsoft Web Api 默认的放置(更新)端点看起来像这样,public void Update(int id, object data){}
url 为 /api/beers/{id}
。要使用此方法,您需要更改我编写的 updateLikes
方法的代码。
见下文:
$scope.updateLikes = function(beer, likeCount){
beer.likes+= likeCount;
$http({
method: 'PUT',
url: '/api/beer/' + beer.id,
data: JSON.stringify(beer),
}).then(function successCallback(response) {
console.log("Updated!");
//Trigger reload of data
$scope.beerSum();
}, function errorCallback(response) {
console.log("not updated")
});
};
额外帮助
如果您仍然遇到问题并且在 GitHub 环境中工作,我很乐意更直接地帮助您编写代码。除此之外,我已经发布了你的问题的答案,并且我认为这是 AngularJS 的良好编码实践。除了一个小例外,代码中有一个更改为 beer.likes += likeCount
的行,因为这也更新了原始啤酒对象。我想这是偏好,但如果您需要更多帮助,请与我联系。
JS:
angular.module('beerApp', []).controller('BeerController', function($scope, $http) {
$scope.allBeer = [];
$scope.beerSum = function() {
$http({
method: 'GET',
url: '/api/beers' //<-- Added string opening and closing tags
}).
then( function(response) {
if(typeof response === 'object') {
var dataArr = response.data;
for (var i = 0; i < dataArr.length; i++) {
var beer = dataArr[i];
$scope.allBeer.push(beer);
}
} else {
return;
}
}, function(error) {
console.log('i am an error', error);
})
};
$scope.beerSum();
$scope.increase = function(beer){
var newLikes = beer.likes++;
//Your code
$http({
method: 'PUT',
url: '/api/beer/', //<-- closing
data: JSON.stringify($scope.allBeer.likes), //<-- Where does likes come from? $scope.allBeer is an array of beer but the array itself doesn't have a property called likes.
}).then(function successCallback(response) {
console.log("Updated!");
}, function errorCallback(response) {
console.log("not updated")
});
//End your code
//My Code
beer.likes+=1; //<-- My bad I fixed this.
$http({
method: 'PUT',
url: '/api/beer/', //<-- closing
data: JSON.stringify(beer), //<-- The object you passed into the function
}).then(function successCallback(response) {
console.log("Updated!");
}, function errorCallback(response) {
console.log("not updated")
});
//End my code
};
可能出现的问题
- 您的 api 不适用于 put,在这种情况下,此问题不正确。
- 您的程序内部还有其他问题,但从现在开始我认为您正在寻找 api 的问题,无论是什么问题。
angular.module('beerApp', []).controller('BeerController', function($scope, $http) {
$scope.allBeer = [];
$scope.beerSum = function() {
$scope.allBeer.push({
"name": "Miller Lite",
"likes": 0
});
$http({
method: 'GET',
url: '/api/beers' //<-- Added string opening and closing tags
}).
then( function(response) {
if(typeof response === 'object') {
var dataArr = response.data;
for (var i = 0; i < dataArr.length; i++) {
var beer = dataArr[i];
$scope.allBeer.push(beer);
}
}
}, function(error) {
console.log('i am an error', error);
})
};
$scope.beerSum();
$scope.updateLikes = function(beer, likeCount){
beer.likes+= likeCount;
$http({
method: 'PUT',
url: '/api/beer/',
data: JSON.stringify(beer),
}).then(function successCallback(response) {
console.log("Updated!");
//Trigger reload of data
$scope.beerSum();
}, function errorCallback(response) {
console.log("not updated")
});
};
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<!DOCTYPE html>
<html>
<head>
<script data-require="angular.js@1.6.2" data-semver="1.6.2" src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.2/angular.js"></script>
<link rel="stylesheet" href="style.css" />
<script src="script.js"></script>
</head>
<body>
<div ng-app="beerApp" ng-controller="BeerController" class="jumbotron">
<h1>Beers on Tap</h1>
<div class="all-beer">
<div class="single-beer" ng-repeat="beer in allBeer">
<div>{{beer.name}}</div>
<div>{{beer.likes}}</div>
<button ng-click="updateLikes(beer, -1)">Down Vote</button>
<button ng-click="updateLikes(beer, 1)">Up Vote</button>
</div>
</div>
</div>
</body>
</html>
我正在尝试创建一个计算啤酒点赞数的应用程序!这将更新存储啤酒的 API,然后使用 PUT 方法更新 API 和 angularJS 视图上的点赞数。每次单击类似内容时,我都能使视图正常工作。我不确定为什么我的 PUT 方法继续 return 404 而不会更新 API。请参阅下面的代码了解我的 put 方法。为此,我还包括了我的 JS 和 HTML。我觉得我很接近,但不知道如何让 "likes" 在 API 上更新。先感谢您!!我认为我将不正确的数据传递给 PUT 方法。
HTML:
<div ng-app="beerApp" ng-controller="BeerController" class="jumbotron">
<div class="all-beer">
<div class="single-beer" ng-repeat="beer in allBeer">
<div>{{beer.name}}</div>
<div>{{beer.likes}}</div>
<button ng-click="decrease(beer)">X</button>
<button ng-click="increase(beer)"></button>
</div>
</div>
</div>
JS:
angular.module('beerApp', []).controller('BeerController', function($scope, $http) {
$scope.allBeer = [];
$scope.beerSum = function() {
$http({
method: 'GET',
url: /api/beers
}).
then( function(response) {
if(typeof response === 'object') {
var dataArr = response.data;
for (var i = 0; i < dataArr.length; i++) {
var beer = dataArr[i];
$scope.allBeer.push(beer);
}
} else {
return;
}
}, function(error) {
console.log('i am an error', error);
})
};
$scope.beerSum();
$scope.increase = function(beer){
var newLikes = beer.likes++;
$http({
method: 'PUT',
url: '/api/beer/',
data: JSON.stringify($scope.allBeer.likes),
}).then(function successCallback(response) {
console.log("Updated!");
}, function errorCallback(response) {
console.log("not updated")
});
};
首先,您缺少一些 http api 的语法。其次,您在不存在的数组上调用 属性 。第三,由于您的逻辑,您的 api 将无法工作。你有一系列啤酒,你想增加对单一啤酒的喜欢。在接受啤酒的服务器上创建一个方法,服务器将获取该啤酒并将其喜欢数增加 1,然后保存到数据库或其他任何地方。
根据您使用的服务器,您有两种选择。
您可以简单地在 /api/beers
定义一个命令,并将服务器配置为接受一个对象并将该对象 ID 用于服务器更新。如果是这种情况,我建议创建此端点 /api/beers/update
并将其设为 POST,并将对象传递给它,然后在此命令中执行所有更新逻辑。
或者例如 Microsoft Web Api 默认的放置(更新)端点看起来像这样,public void Update(int id, object data){}
url 为 /api/beers/{id}
。要使用此方法,您需要更改我编写的 updateLikes
方法的代码。
见下文:
$scope.updateLikes = function(beer, likeCount){
beer.likes+= likeCount;
$http({
method: 'PUT',
url: '/api/beer/' + beer.id,
data: JSON.stringify(beer),
}).then(function successCallback(response) {
console.log("Updated!");
//Trigger reload of data
$scope.beerSum();
}, function errorCallback(response) {
console.log("not updated")
});
};
额外帮助
如果您仍然遇到问题并且在 GitHub 环境中工作,我很乐意更直接地帮助您编写代码。除此之外,我已经发布了你的问题的答案,并且我认为这是 AngularJS 的良好编码实践。除了一个小例外,代码中有一个更改为 beer.likes += likeCount
的行,因为这也更新了原始啤酒对象。我想这是偏好,但如果您需要更多帮助,请与我联系。
JS:
angular.module('beerApp', []).controller('BeerController', function($scope, $http) {
$scope.allBeer = [];
$scope.beerSum = function() {
$http({
method: 'GET',
url: '/api/beers' //<-- Added string opening and closing tags
}).
then( function(response) {
if(typeof response === 'object') {
var dataArr = response.data;
for (var i = 0; i < dataArr.length; i++) {
var beer = dataArr[i];
$scope.allBeer.push(beer);
}
} else {
return;
}
}, function(error) {
console.log('i am an error', error);
})
};
$scope.beerSum();
$scope.increase = function(beer){
var newLikes = beer.likes++;
//Your code
$http({
method: 'PUT',
url: '/api/beer/', //<-- closing
data: JSON.stringify($scope.allBeer.likes), //<-- Where does likes come from? $scope.allBeer is an array of beer but the array itself doesn't have a property called likes.
}).then(function successCallback(response) {
console.log("Updated!");
}, function errorCallback(response) {
console.log("not updated")
});
//End your code
//My Code
beer.likes+=1; //<-- My bad I fixed this.
$http({
method: 'PUT',
url: '/api/beer/', //<-- closing
data: JSON.stringify(beer), //<-- The object you passed into the function
}).then(function successCallback(response) {
console.log("Updated!");
}, function errorCallback(response) {
console.log("not updated")
});
//End my code
};
可能出现的问题
- 您的 api 不适用于 put,在这种情况下,此问题不正确。
- 您的程序内部还有其他问题,但从现在开始我认为您正在寻找 api 的问题,无论是什么问题。
angular.module('beerApp', []).controller('BeerController', function($scope, $http) {
$scope.allBeer = [];
$scope.beerSum = function() {
$scope.allBeer.push({
"name": "Miller Lite",
"likes": 0
});
$http({
method: 'GET',
url: '/api/beers' //<-- Added string opening and closing tags
}).
then( function(response) {
if(typeof response === 'object') {
var dataArr = response.data;
for (var i = 0; i < dataArr.length; i++) {
var beer = dataArr[i];
$scope.allBeer.push(beer);
}
}
}, function(error) {
console.log('i am an error', error);
})
};
$scope.beerSum();
$scope.updateLikes = function(beer, likeCount){
beer.likes+= likeCount;
$http({
method: 'PUT',
url: '/api/beer/',
data: JSON.stringify(beer),
}).then(function successCallback(response) {
console.log("Updated!");
//Trigger reload of data
$scope.beerSum();
}, function errorCallback(response) {
console.log("not updated")
});
};
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<!DOCTYPE html>
<html>
<head>
<script data-require="angular.js@1.6.2" data-semver="1.6.2" src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.2/angular.js"></script>
<link rel="stylesheet" href="style.css" />
<script src="script.js"></script>
</head>
<body>
<div ng-app="beerApp" ng-controller="BeerController" class="jumbotron">
<h1>Beers on Tap</h1>
<div class="all-beer">
<div class="single-beer" ng-repeat="beer in allBeer">
<div>{{beer.name}}</div>
<div>{{beer.likes}}</div>
<button ng-click="updateLikes(beer, -1)">Down Vote</button>
<button ng-click="updateLikes(beer, 1)">Up Vote</button>
</div>
</div>
</div>
</body>
</html>