【问题标题】:angularjs and ionicframework how to increment likes in real timeangularjs和ionicframework如何实时增加喜欢
【发布时间】:2015-04-16 14:36:44
【问题描述】:

我几乎是 AngularJS 和 IonicFramework 的新手。 我正在开发我自己的应用程序,其中有一个带有时间线的小社交网络(我从 mysql 获得,我用 php 在 json 中编码)和某种喜欢。这是一件非常简单的事情。

我使用$http.get检索json数据,是这样的:

        [{
        "id": "2",
        "timestamp": "2015-04-15 23:26:48",
        "autore": "reallidontknow",
        "likes": "2",
        "testo": "asd"
        },
        {
        "id": "3",
        "timestamp": "2015-04-15 23:26:39",
        "autore": "costi",
        "likes": "2",
        "testo": "rotfl"
        },
        {
        "id": "1",
        "timestamp": "2015-04-15 23:06:27",
        "autore": "stevvi",
        "likes": "1",
        "testo": "aaaaahahah"
        }
        ]

这是我的 HTML:

            <div class="list card" ng-repeat="post in posts">
          <div class="item item-avatar">
            <img src="img/icon.png"> 
            <h2>{{post.autore}}</h2>
            <p>{{post.timestamp}}</p>
          </div>

          <div class="item item-body">
            <p ng-bind-html="post.testo">

            </p>
            <p>
                <a href="#" class="subdued"><i>{{post.likes}}</i> Mi Piace</a>
            </p>
          </div>

          <div class="item tabs tabs-secondary tabs-icon-left">
            <a class="tab-item" href="#" ng-click="like(post.id)">
              <i class="icon ion-thumbsup"></i>
              Mi Piace!
            </a>
          </div>
        </div>

这是我的控制器的一部分:注意:使用 http get 我做一个“发布”,我知道这是一种糟糕的方式,但很简单,所以真正做一个发布。 (使用 idPost,我会向服务器发送哪些帖子必须在他的点赞栏中 +1)

$scope.like = function(idPost) {
    var lsVar = "like"+idPost;
    if (window.localStorage[lsVar] != undefined)
    {
        return;
    }
    else
    {

        urLike = "http://my_link.php?ggettt="+idPost;
        $http.get(urLike).success(function(data, status, headers, config) {
            console.log(JSON.stringify(data));
            if ((data.idPost == "false") || (data.idPost == "null"))
            {
                alert("Error.\n retry!");
                $window.location.reload(true);
            }
            else if (data.idPost == "noId") {
                alert("Error FATAL.");
                $window.location.reload(true);
            }
            else {
                window.localStorage[lsVar] = idPost;
                alert("LIKE inserted");
                });

            }
        }).error(function(data, status, headers, config) {
            console.log(JSON.stringify(data));
        });
    }
}

我的问题是,如果我点击“喜欢”按钮,我必须使用 $window.location 重新加载整个页面(这太糟糕了!!!!)如您所见,因为如果我只使用 $state 重新加载命令它不会改变任何东西..如果我使用$route.reload(),也是一样的。

我必须实时更改类似(放+1)并将按钮从“活动”更改为“不活动”

对于这个问题,如果一个人已经喜欢(它保存在本地存储中以便记住它)并且该人再次单击“喜欢”它会出现(必须如此)警报。但是当该人单击“确定”并单击另一个位置时,警报会再次出现。这是什么!?

【问题讨论】:

  • 服务器上的问题是我必须“重新加载”页面才能看到 +1

标签: javascript json angularjs ionic-framework ionic


【解决方案1】:

关于没有立即看到 +1,那是因为您只有在收到来自服务器的“成功响应”时才更新本地存储。

为了解决这个问题,你应该替换

<a class="tab-item" href="#" ng-click="like(post.id)">

<a class="tab-item" href="#" ng-click="like(post)">

然后,修改“like”函数如下(考虑到服务器返回的“data”是包含like的实际帖子):

$scope.like = function(post) {
    var lsVar = "like"+post.id;
    if (window.localStorage[lsVar] != undefined)
    {
        return;
    }
    else
    {

        urLike = "http://my_link.php?ggettt="+post.id;
        $http.get(urLike).success(function(data, status, headers, config) {
            console.log(JSON.stringify(data));
            if ((data.idPost == "false") || (data.idPost == "null"))
            {
                alert("Error.\n retry!");
                $window.location.reload(true);
            }
            else if (data.idPost == "noId") {
                alert("Error FATAL.");
                $window.location.reload(true);
            }
            else {
                window.localStorage[lsVar] = idPost;
                post = data;
                alert("LIKE inserted");
                });

            }
        }).error(function(data, status, headers, config) {
            console.log(JSON.stringify(data));
        });
    }
}

“帖子=数据;”可能需要根据您从服务器收到的响应进行一些更改 + 您可能必须执行 $scope.$apply() 或直接更新 $scope.posts 以刷新屏幕上的数据,但总体思路是您有更新您的 $scope.posts 中的点赞数,以使其在屏幕上刷新。

无论如何,您应该知道最佳实践是在服务器端保存和验证哪个用户喜欢什么,因为在客户端保存和验证这意味着用户可以编辑/删除数据+同一用户将能够从不同的机器/浏览器,喜欢同一个帖子几次。

我希望this demo 能帮助你重新开始......

【讨论】:

  • 但是使用整个“post”变量有什么变化?是的,我知道,它保存在服务器上,我知道它不是很安全,但它是一个小应用程序,仅供十几个朋友使用..
  • 整个帖子对象,其中还包含点赞数。您也可以将其更改为 post.likes++;而不是依赖服务器响应
  • 并将“喜欢”按钮设置为禁用如何?因为如果我在.success() 函数中执行$scope.success = "something",我会得到所有按钮都显示相同的消息。但是怎么做:如果在localStorage 中,该帖子被如此喜欢,则仅在该帖子中显示其他内容,而不是“Mi piace”(在意大利语中表示“喜欢”)..希望您能理解。不过谢谢!
【解决方案2】:

像这样更改您的 html(只是按钮 div):

      <div class="item tabs tabs-secondary tabs-icon-left" ng-hide="post.has_liked">
        <a class="tab-item" href="#" ng-click="like(post.id)">
          <i class="icon ion-thumbsup"></i>
          Mi Piace!
        </a>
      </div>
      <div class="item tabs tabs-secondary tabs-icon-left" ng-show="post.has_liked">
        <span class="tab-item">
          <i class="icon ion-thumbsup"></i>
          +1
        </span>
      </div>

之后在你的 js 中,当你从服务器得到确认时,将 true 放入 post 对象的 has_liked 属性中。

post.has_liked = true;

【讨论】:

  • 这不是我问的。我只有通过客户端有问题。服务器没问题,我加点赞,问题是如何在客户端实时加1,禁用点赞按钮。谢谢
  • 对不起,我根据你的问题改了答案。
猜你喜欢
  • 1970-01-01
  • 2019-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-19
  • 2013-04-03
  • 2019-10-06
相关资源
最近更新 更多