【问题标题】:Creating a "Like" button with Angular.js使用 Angular.js 创建一个“赞”按钮
【发布时间】:2015-11-21 18:35:49
【问题描述】:

我正在尝试使用 Angular.js 创建一个赞按钮。 (它只是一个心形图标。默认颜色为白色 = 不喜欢。喜欢时为红色。喜欢/不喜欢通过单击切换) 我从我的 Web 服务中获取了一些数据,这些数据也有一些 ID 的数组。这些 ID 是之前点击过点赞按钮的 ID。

然后我根据从 Web 服务检索到的数据使用 ng-repeat 指令填充 DOM。

我为按钮附加了一个设置正确类的 ng-class 和一个应该以某种方式更改类的 ng-click 指令。 * 我无法连接 ng-class 和 ng-click 结果。

一些代码:

<div ng-repeat="photo in photos track by photo._id">
    <button ng-class="{carouselFooterButtonLikeActive : initLike(photo)}" ng-click="like(photo, this)">
        <i class="icon ion-heart"></i>
    </button>
</div>

控制器:

//  Handle like button click
$scope.like = function(photo, photoScope){

    HOW CAN I AFFECT THE NG-CLASS FROM HERE?
}


$scope.initLike = function(photo){
    if(photo.likes.indexOf($localstorage.getObject('userInfo').id) > -1) {
        $scope.liked = true;
        return true;
    }

    $scope.liked = false;
    return false;
}

编辑:添加了从网络服务检索到的可能数据

{
    photos: [
      {
           src: "src1.jpg",
           likes:[111,222,333]
      },

      {
           src: "src2.jpg", 
           likes:[] 
      }
   ]
}

【问题讨论】:

    标签: angularjs


    【解决方案1】:

    您可以使用一些附加属性作为标志,这些属性最初将在每个photo 元素上未定义 - 比如photo.liked。当用户单击它时,$scope.like 函数将此属性设置为 true。然后ng-classphoto.liked 评估为true 并将carouselFooterButtonLikeActive 类添加到button 元素。

    代码如下:

    在模板中:

    <button ng-class="{'carouselFooterButtonLikeActive' : photo.liked}" ng-click="like(photo, this)">
    

    在控制器中:

    $scope.like = function(photo, photoScope){
      photo.liked = true;
    }
    

    UPD 假设你有photos 数组:

    [
    {'src':'bla-bla.jpg', liked: true, id: 8347},
    {'src':'foo-bar.jpg', id: 45},
    {'src':'baz-baz.jpg', id: 47}
    ]
    

    那么只有第一个会显示button.carouselFooterButtonLikeActive 类,这要感谢ng-class 评估表达式。

    UPD2 如果 photo.likes 是一个数组,你可以使用:

    //template
    ng-class="{'carouselFooterButtonLikeActive' : (photo.likes && photo.likes.length >0)}"
    
    //controller
    $scope.like = function(photo, photoScope){
      photo.likes.push(someUserID);
    }
    

    【讨论】:

    • 我正在考虑做确切的事情,但这并不能解决问题,因为必须首先根据来自 Web 服务的数据初始化喜欢按钮。
    • 你是什么意思'按钮必须被初始化'?它是模板的一部分,遍历照片数组。定义照片数组后,您将在模板中显示数据
    • 我的意思是,在您的解决方案中,所有按钮都设置为“不同状态”。如果我从服务中得到一个“喜欢”的按钮怎么办?您的解决方案会将其显示为不喜欢而不是喜欢。
    • 那么它仍然有效 - 如果其中一个数组项已经喜欢 = true,那么它将从一开始就正确显示为喜欢。检查更新的答案
    • photo.liked 直到用户单击按钮才被定义。我认为有一个误解。想象一下,您从 Web 服务中获取如下数据:{photos: [ {src: "src1.jpg, likes:[111,222,333]},{src: "src2.jpg, likes:[] }]}。如您所见,第一个元素有 3 个赞,第二个没有。当我加载我的模板时,我想展示它。并且还使用 ng-click 来添加一个like 切换
    猜你喜欢
    • 1970-01-01
    • 2013-12-24
    • 1970-01-01
    • 2019-09-17
    • 1970-01-01
    • 2021-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多