2014-10-24 2 views
0

Я изучаю AngularJS, следуя книге, но я застрял в некоторых строках кода, которые вряд ли объясняются в книге.У меня проблема с пониманием кода в AngularJS

Так это selectCategory() функция включена в нг-клик директивы

<a ng-click="selectCategory()">Home</a> 

<a ng-repeat="item in data.products | orderBy:'category' | unique:'category'" 
    ng-click="selectCategory(item)"> 

    {{item}} 

</a> 

, а также вот фильтр, который используется для фильтрации списка продуктов на основе их категорий, когда директива нг щелчок запускается

ng-repeat="item in data.products | filter:categoryFilterFn"> 

эти два определяются следующим образом:

angular.module("sportsStore") 
.controller("productListCtrl", function ($scope, $filter) { 

    var selectedCategory = null; 

    $scope.selectCategory = function (newCategory) { 
     selectedCategory = newCategory; 
    } 

    $scope.categoryFilterFn = function (product) { 
     return selectedCategory == null || 
     product.category == selectedCategory; 
    } 
}); 

Я уже много времени пытался понять этот код, но я все еще довольно смущен, особенно о том, как определяются две функции. Почему в аргументе также включен $ filter? А также вы можете объяснить эти определения, пожалуйста, я действительно потерян. Простите меня за новичка и огромное спасибо!

ответ

1

Это действительно плохой пример!

Оно должно быть:

<a ng-click="selectCategory()">Home</a> 

<a ng-repeat="item in data.products | orderBy:'category' | unique:'category'" 
    ng-click="selectCategory(item.category)"> 

    {{item.category}} 

</a> 

Так вот вы выбираете категорию из доступных категорий (уникальные категории продукции), то продукты, которые имеют эти категории перечислены (нг-повтор = "элемент в данных. продукты | фильтр: categoryFilterFn>)

categoryFilterFn является функцией фильтра, поэтому продукты, имеющие категорию == selectedCategory перечислены, и если нет selectedCategory всех продукты перечислены :)

Надеется, что это помогает

+0

и не нужно вводить $ filter в этот контроллер (нет необходимости добавлять его в качестве аргумента) – christina

+0

Привет, извините, мой поздний ответ. Код в примере действительно правильный. Поправьте меня, если я ошибаюсь, позвольте мне немного объяснить и посмотреть, если я это правильно понимаю. $ scope.data выглядит примерно так, { \t продуктов: [ \t {имя: "Продукт # 1", описание: "Продукт", \t категория: "Категория # 1", цена: 100} , \t {...}, \t {...}]} так что «элемент» на самом деле относится к целому {} блока, а потому, что есть «уникальный» фильтр, пункт теперь относится только к категории , – jwong

+0

Когда нажата кнопка «Главная», вызывается selectCategory(). Поскольку аргумент не передается, «newCategory» имеет значение null, так что «selectedCategory» также является нулевым, и это делает categoryFilterFn неспособным фильтровать что-либо, чтобы продукты всех категорий были указаны в «Главная». Но если в вызове передается «элемент», относящийся к одной из категорий, переменная «selectedCategory» больше не пуста, так что «categoryFilterFn» может фильтровать все продукты этой категории. – jwong

Смежные вопросы