Angular.js:如何从无序列表中获取orderBy或过滤器?

时间:2012-12-04 21:09:11

标签: javascript angularjs

尝试根据价格和评级进行排序(在返回的对象中)。我宁愿做一个按钮而不是使用选择菜单。这有可能吗?我一直在四处寻找,这是我最接近的。

    <ul class="restaurant-filter">
        <li> <i class="icon-search"></i>Organize results by "Price" &amp; "Rating"&hellip;
            <ul ng-model="priceAndRating">
                <li ng-click="price">Price</li>
                <li ng-click="rating">Rating</li>
            </ul>
        </li>
    </ul>

    <ul class="available-restaurants">
        <li ng-repeat="restaurant in availableRestaurants | orderBy:priceAndRating" ng-click="addRestaurantToEvent(restaurant.restaurantName)">
            <h6>{{restaurant.restaurantName}}</h6>
            <p>label one two three for five six</p>

            <i class="icon-chevron-right"></i>                    
        </li>
    </ul>

availableRestaurants是我的对象。

2 个答案:

答案 0 :(得分:11)

你没有给我们你的数据结构或你的控制器,所以我做了一个简单的你做了你想要的。这是the fiddle

注意:ng-click需要调用函数或执行一些代码。您可以编写一个函数文字来设置属性,但这是将控制器逻辑混合到视图中(想想如果稍后需要更改的排序会发生什么,您需要在视图中更新该逻辑,这很糟糕。)

我添加了一个sort函数来处理它,它只占用了属性。您可以根据需要进行设置。

HTML:

<div ng-app="miniapp">
    <div ng-controller="Ctrl1">
        <ul class="restaurant-filter">
        <li> <i class="icon-search"></i>Organize results by "Price" &amp; "Rating"&hellip;
            <ul>
                <li ng-repeat="option in sortOptions" ng-click="setSort (option)">{{option}}</li>
            </ul>
        </li>
    </ul>

    <ul class="available-restaurants">
        <li ng-repeat="r in availableRestaurants | orderBy:sort">
            <span>{{r.name}} - {{r.rating}}</span>                  
        </li>
    </ul>
    </div>
</div>​

JS:

function Ctrl1($scope) {
    $scope.sortOptions = ["Price", "Rating"];
    $scope.sort = "Price";
    $scope.setSort = function(type) { $scope.sort = type.toLowerCase(); };
    $scope.availableRestaurants = [{name: "Chevy's", rating: 6, price: 6},
                                  {name: "Burger King", rating: 2, price: 1},
                                  {name: "Red Robin", rating: 4, price: 4},
                                  {name: "Carl's Jr", rating: 5, price: 2}];
}

答案 1 :(得分:2)

我已将您的代码复制并粘贴到小提琴中:

http://jsfiddle.net/blesh/tSHUf/

ng-click需要执行某些事情,它不会拥有来调用Tyrsius声明的函数,但它应该执行一些代码。正如您在我的小提琴中看到的那样,我在名为order = 'price''rating'的范围内设置了一个属性,具体取决于您点击的内容。

然后你orderBy:order将eval $ $ scope.order中的任何内容,这是你点击设置的。

我希望有所帮助。