防止多个upvote Angularjs

时间:2016-04-21 16:16:50

标签: javascript angularjs

为我的英语开始抱歉。 我对这个问题进行了一些搜索,但对我来说没什么用。

我的问题很简单: 我有一个upvote系统,用户可以通过upvote(如Stackoverflow)。但问题是用户可以多次投票(并且它不太好......)。
我尝试制作一个禁用ng的按钮,但如果我这样做,用户只能为所有帖子投票一次(我的意思是如果他们投票赞成#34;发布A"他们可以&# 39; t upvote" Post B")。

这是我的控制器功能:

$scope.incrementUpvotes = function(post) {
        posts.upvote(post);
    };

这是我的工厂功能:

o.upvote = function(post){
    return $http.put('/posts/' + post._id + '/upvote', null, {
        headers: {Authorization: 'Bearer '+auth.getToken()}
    }).success(function(data){
        post.upvotes += 1;
    });
};

这里是html:

<span class="glyphicon glyphicon-thumbs-up" ng-click="incrementUpvotes(post)"></span>

如果有人可以帮助我,那就太好了!提前谢谢!

3 个答案:

答案 0 :(得分:2)

请尝试使用buttoninput代替span。由于disabledspan中无效。

<button id="{{ post._id + 'upvote' }}" class="glyphicon glyphicon-thumbs-up" ng-click="incrementUpvotes(post)"></button>

然后在upvote操作后设置upvote disabled的{​​{1}}属性。

button

答案 1 :(得分:2)

这是一个建筑问题,而不是javascript / angularjs问题。有很多方法可以做到这一点。但这个想法是存储在数据库中并保留upvote信息,否则用户只需刷新页面并再次upvote。

最直接的解决方案是:您必须在用户级别的后端存储您的投票信息。当您查询用户信息时,请存储一个上调的帖子列表,如下所示:

myDataService应如下所示:

angular.module("app", []).service("myDataService", ["$http","$q","$rootScope", function myDataService($http, $q, $rootScope) {
    var myDataService = this;

    myDataService.getPostsUpvoted = function(userId) {
        var defer = $q.defer();

        //here you format your payload to deliver userId to the api backend
        var payload = { userId: userId };

        //your api backend 'getpostsupvoted' should accept a userId, then in return it should
        //deliver a list of posts upvoted by that user
        $http.post("/api/getpostsupvoted", payload).then(function (data, status, headers, config) {
            //call success
            defer.resolve(data);
        }, function(data, status, headers, config) {
            //an error occurred
            defer.reject(data);
        });

        return defer.promise;
    }

    return myDataService;
})];

然后,这就是您在控制器中使用该服务的方式。

//inject scope and myDataservice into controller
angular.module("app", []).controller("MainCtrl", ["$scope", "myDataService", function($scope, myDataService) {

    //create a new array to hold a list of upvotes
    $scope.user.upVoted = [];
    myDataService.getPostsUpvoted($scope.user.id).then(function(data) {
        //set upvoted array to data
        $scope.user.upVoted = data;
    }, function(error) {
        //blah an error occurred
    });

})];

在您的控制器中,提供一项功能,以检查帖子是否已被投票。

$scope.IsUpvotedAlready = function(postId) {

    if($scope.user.upVoted.indexOf(postId) > -1)
        return true;

    return false;

}

您还必须将post._id推送到upVoted数组并将其保留在那里。

$scope.incrementUpvotes = function(post) {

    //check if it's already been upvoted, then do nothing
    if($scope.user.upVotes.indexOf(post._id) > -1)
        return;

    posts.upvote(post);

    $scope.user.upVoted.push(post._id);
};

然后,在显示帖子的ng-repeat指令中,检查upvotes列表是否包含post._id。

<div ng-repeat="post in posts">
    <div ng-if="IsUpvotedAlready(post._id)">
        <!-- display something since already upvoted !-->
    </div>
    {{ post }}
</div>

答案 2 :(得分:1)

在您迭代帖子时的模板中,每个帖子都有一个标记,用于标识是否已经过投票。

在标记为true的upvote函数标记中,并在ng-disabled指令中使用它,如下所示:

ng-disabled={{post.isUpvoted}}