2016-11-04 24 views
6

NG重複和JSON數據要顯示div n次,根據其從JSON獲得價值。CSS星級使用angularjs

我的目標:

$scope.pro = [ 
    { 
     product: "chicken", 
     rating: 3 
    }, 
    { 
     product: "fish", 
     rating: 3 
    }, 
    { 
     product: "pizza", 
     rating: 4 
    } 
]; 

如果產品有3個等級意味着div必須表現出三次,就像一個星級。
如何在angular.js中做到這一點?

My Plunker Demo

回答

4

你可以嘗試對此,

JS

$scope.pro = [{product: "chicken", rating: 3},{product: "fish", rating: 3},{product: "pizza", rating: 4}]; 

var ratingTotal = 5; 

$scope.getRepeater = function() { 
    return new Array(ratingTotal); 
}; 

的Html

<!DOCTYPE html> 
<html ng-app="myApp"> 

    <head> 
    <script data-require="[email protected]" data-semver="1.3.15" src="https://code.angularjs.org/1.3.15/angular.js"></script> 
    <link rel="stylesheet" href="style.css" /> 
    <script src="script.js"></script> 
    </head> 

    <body ng-controller="myController"> 

    <div ng-repeat="array in pro">{{array.product}} <span class="star-icon" ng-repeat="r in getRepeater() track by $index" ng-class="{'full': ($index + 1) <= array.rating, 'half': ($index + .5) == array.rating}" ></span></div> 

    </body> 

</html> 

注意:對所選明星類的名字被提及作爲「全」和隨意改變這一點。

+0

我可以知道如何打印剩餘的div(即)我想循環5個值,從json + 2其他值的3個值?就像星級評分 –

+0

它總是5? – Aruna

+0

可以更改...我們可以去五個 –

3

您可以創建一個陣列,基於評級。然後在該數組重複:

<div ng-repeat="array in pro"> 
    {{array.product}} , <span ng-repeat="n in createArray(array.rating) track by $index">X</span> 
</div> 

在你的控制器:

$scope.createArray = function(n){  
    return new Array(n); 
} 

https://plnkr.co/edit/gUPn6m7Tiu01yksa9VOs?p=preview

+0

這個plunker和OP的 –

+0

一樣你是對的,我把它改成了正確的一個 – devqon

+0

@devqon我可以知道如何打印剩下的div(即)我想循環5個值,從json + 2中得到3個值其他值?就像星級評分。 –

3

geNumber()將創建一個等級的大小的空數組。 ng-repeat將遍歷它,不管裏面是什麼

track by $index在這種情況下,必要的,因爲你會顯示多次的轉發器相同的值,不允許重複

var app = angular.module('myApp', []); 
 

 
app.controller('myController', function($scope) { 
 
    $scope.pro = [{ 
 
    product: "chicken", 
 
    rating: 3 
 
    }, { 
 
    product: "fish", 
 
    rating: 3 
 
    }, { 
 
    product: "pizza", 
 
    rating: 4 
 
    }]; 
 
    
 
    $scope.getNumber = function(num){ 
 
    return new Array(num); 
 
    } 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> 
 

 
<body ng-app="myApp" ng-controller="myController"> 
 

 
    <div ng-repeat="item in pro"> 
 
    <div ng-repeat="n in getNumber(item.rating) track by $index"> 
 
     {{item.product}} 
 
    </div> 
 
    </div> 
 

 
</body>

1

如果你感到花哨,你可以使用這個ES6解決方案,以顯示*X號:
注:不支持IE瀏覽器在所有。

JS

$scope.getAsterisks = rating => Array.from('*'.repeat(parseInt(rating, 10))); 

HTML

<span ng-repeat="x in getAsterisks(array.rating) track by $index">{{x}}</span> 

Plunker:https://plnkr.co/edit/9H3j3NH9w5xNvqM142Gq?p=preview

信息的ES6功能:
Array.from(在IE中不支持)從一個字符串創建一個數組,每個字符變成一個數組項。
String.prototype.repeat(在IE和Opera不支持)...重複串X倍。

1

<div ng-repeat="array in pro">{{array.product}} , 
    <span ng-repeat=" arr in array.rating ">{{arr.j}}</span> 
</div> 

//代碼放在這裏

// Code goes here 
 

 
var app = angular.module('myApp', []); 
 

 
app.controller('myController', function($scope) { 
 
    $scope.pro = [{product: "chicken", rating: 3},{product: "fish", rating: 4},{product: "pizza", rating: 6}]; 
 
    for(var i=0;i<$scope.pro.length;i++) 
 
    { 
 
    if($scope.pro[i].rating >0) 
 
    { 
 
     $scope[$scope.pro[i].product]=[]; 
 
     for(var j=0;j< $scope.pro[i].rating;j++) 
 
     { 
 
      $scope[$scope.pro[i].product].push({j:'*'}); 
 
     } 
 
     $scope.pro[i].rating = $scope[$scope.pro[i].product]; 
 
    } 
 
    } 
 
});
<!DOCTYPE html> 
 
<html ng-app="myApp"> 
 

 
    <head> 
 
    <script data-require="[email protected]" data-semver="1.3.15" src="https://code.angularjs.org/1.3.15/angular.js"></script> 
 
    <link rel="stylesheet" href="style.css" /> 
 
    <script src="script.js"></script> 
 
    </head> 
 

 
    <body ng-controller="myController"> 
 

 
    <div ng-repeat="array in pro">{{array.product}} , 
 
     <span ng-repeat=" arr in array.rating ">{{arr.j}}</span> 
 
    </div> 
 
    
 
    </body> 
 

 
</html>

1

一個更好的辦法來做到這一點是通過自定義指令也可以在整個角應用程序重複使用,以創建一個明星成分,這個指令需要的等級,並生成數量DOM中的星星。

angular 
 
    .module('demo', []) 
 
    .controller('DefaultController', DefaultController) 
 
    .controller('StarController', StarController) 
 
    .directive('star', star); 
 

 
function DefaultController() { 
 
    var vm = this; 
 
    vm.products = [{ 
 
    product: "chicken", 
 
    rating: 3 
 
    }, { 
 
    product: "fish", 
 
    rating: 4 
 
    }, { 
 
    product: "pizza", 
 
    rating: 5 
 
    }]; 
 
} 
 

 
function star() { 
 
    var directive = { 
 
    restrict: 'E', 
 
    scope: { 
 
     rating: '=', 
 
     max: '=' 
 
    }, 
 
    link: linkFunc, 
 
    controller: StarController, 
 
    controllerAs: 'star', 
 
    bindToController: true 
 
    }; 
 

 
    return directive; 
 

 
    function linkFunc(scope, element, attrs, ngModelCtrl) { 
 
    for (var i = 0; i < scope.max; i++) { 
 
     var fillStyle = ''; 
 
     if (i < scope.rating) { 
 
     fillStyle = 'fill'; 
 
     } else { 
 
     fillStyle = 'empty'; 
 
     } 
 

 
     element.append('<span class="star-icon ' + fillStyle + '">☆</span>'); 
 
    } 
 
    } 
 
} 
 

 
function StarController() { 
 
    var vm = this; 
 
}
ul { 
 
    font-size: 20px; 
 
    list-style-type: none; 
 
    padding: 0; 
 
} 
 
ul li { 
 
    padding: 10px; 
 
} 
 
ul li > span { 
 
    display: inline-block; 
 
    width: 100px; 
 
} 
 
star span { 
 
    margin: 0px 5px; 
 
} 
 
.star-icon { 
 
    color: #ddd; 
 
    font-size: 1.5em; 
 
    position: relative; 
 
    top: 3px; 
 
} 
 
.star-icon.fill:before { 
 
    text-shadow: 0 0 1px rgba(0, 0, 0, 0.7); 
 
    color: #FDE16D; 
 
    content: '\2605'; 
 
    position: absolute; 
 
    left: 0; 
 
} 
 
.star-icon.empty:before { 
 
    text-shadow: 0 0 1px rgba(0, 0, 0, 0.7); 
 
    color: #FFF; 
 
    content: '\2605'; 
 
    position: absolute; 
 
    left: 0; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> 
 
<div ng-app="demo"> 
 
    <div ng-controller="DefaultController as ctrl"> 
 
    <ul> 
 
     <li ng-repeat="product in ctrl.products"> 
 
     <span ng-bind="product.product"></span> 
 
     <star rating="product.rating" max="5"></star> 
 
     </li> 
 
    </ul> 
 
    </div> 
 
</div>

星級由https://coderwall.com/p/iml9ka/star-ratings-in-css-utf8

+0

有沒有什麼方法可以顯示非滿員星?五分之一? –

+0

@RamanaaGj,我沒有得到你,請你詳細說明五種方式中的非滿員星,你問的是如何在5星中顯示4.5星? –

+0

我的場景對我來說是好的,但在我的情況下,想要顯示像這樣https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRgnpnK8Gm81TmPR3SeoQztFGDPl23jkYdE5xkOgLBT_Q60F9IDgA –

1

的AngularJS指令ratings啓發:

angular 
 
    .module('myApp', []) 
 
    .directive('ratings', function() { 
 
     return { 
 
      restrict: 'E', 
 
      scope: false, 
 
      template: '<span ng-repeat="x in arrRating track by $index">&#9733;</span>', 
 
      link: function ($scope, $el, $attr) { 
 
       $scope.arrRating = new Array(+$attr.rating); 
 
      } 
 
     }; 
 
    }) 
 
    .controller('myController', function ($scope) { 
 
     $scope.pro = [{product: "chicken",rating: 3}, {product: "fish",rating: 3}, {product: "pizza",rating: 4}, {product: "steak",rating: 10}]; 
 
    });
<script data-require="[email protected]" data-semver="1.3.15" src="https://code.angularjs.org/1.3.15/angular.js"></script> 
 

 
<div ng-app="myApp" ng-controller="myController"> 
 
    <div ng-repeat="p in pro"> 
 
    {{p.product}} <ratings rating="{{p.rating}}"></ratings> 
 
    </div> 
 
</div>