Intereting Posts
Как получить php-mysql для php 5.4.23, пока он противоречит php-common 5.3.28? PHP Soap Server: невозможно получить доступ к параметрам запроса soap в моем вызываемом классе Календарь, смещение перекрывающихся событий CURL post request работает, тогда как PHP (Magento) Varien_Http_Client не Как я могу переставить элементы массива, перемещая зависимости сверху? Перенаправление при нажатии кнопки отправки формы Гик, как рамки внедрения инъекций в PHP PDO: Как получить доступ к файлу Microsoft Access в Linux? Facebook SDK вернул ошибку: проверка подделки на основе перекрестного запроса не удалась. Параметр «состояние» из URL-адреса и сеанса не соответствует Загрузка файла HTML / PHP Получить все определенные классы родительского класса в php mysql_real_escape_string и одиночная кавычка Рекомендации по отображению результатов поиска с соответствующими фрагментами текста из фактического результата Интернационализация в PHP «Недопустимое определение службы» при использовании DI-> Get Phalcon PHP

фильтрация в ng-повторе от ответа JSON

У меня вопрос о фильтрации внутри ng-repeat. Но это не простой вопрос, так как у меня нет проблем, требующих решения. В этом случае я ищу наилучший ответ, который не требует большого количества кода, но все же делает трюк относительно того, как я его хочу. Это станет более понятным в моем описании.

краткое введение:
Поэтому я сейчас работаю над приложением для покупок. Приложение для покупок имеет соединение с существующим интернет-магазином PrestaShop через API веб-сервиса. API для отдыха PrestaShop. Поэтому, после создания раздела клиента, раздела продуктов и системы корзины, я хотел бы иметь возможность обновлять «количество акций» каждого продукта в приложении. Многие люди сказали бы мне: «Ну, это просто, просто создайте форму с данными ответа ng-repeat из базы данных и возможность обновления акции, скажем, кнопку ng-click .

Ну, я сделал это, но теперь это сложная часть, и я объясню, что я приведу несколько менее важных примеров, чтобы сделать это более ясным из того, что я спрашиваю:

База данных prestashop
База данных prestashop – это база данных, насчитывающая более 250 таблиц. Среди этих таблиц – различные соединения через id и id атрибута. Вот несколько простых примеров:

  1. Таблица customer имеет строку id_address которая соединяется с таблицей address . В этой таблице address info is placed. So far, let's say updating a customer I've created a combination of update the вся информация о address info is placed. So far, let's say updating a customer I've created a combination of update the клиентов address info is placed. So far, let's say updating a customer I've created a combination of update the address info is placed. So far, let's say updating a customer I've created a combination of update the table with the клиентов table with the customer_id, but also update the table where the адресов, table where the адрес_id is equal to the id_address from the selected клиента within the таблице клиента.

  2. Продукты также имеют некоторые связанные таблицы. Подумайте о ценах, налогах, размерах и цветах. Свойством id_product_attribute является id_product_attribute , который может соответствовать цвету или размеру.

Как объяснялось выше, структура базы данных prestashop очень детализирована, ограничиваясь использованием различных фильтров для отображения желаемых данных.

Использование веб-сервиса
Поэтому для использования webservice я использую комбинацию angularJS , javascript , php и JSON . JSON – это фактические данные. используя $http.get(url, options) я могу получить данные из базы данных. Затем для отображения данных я использую response . Пример показан ниже:

 $http.get('config/get/getCustomers.php', { cache: true }).then(function (response) { $scope.customers = response.data.customers.customer }); 

используя $scope.customers = response.data.customers.customer дает мне возможность показывать данные клиента, используя, например, ng-repeat как в примере ниже

  $http.get('config/get/getCustomers.php', { cache: true }).then(function (response) { $scope.customers = response.data.customers.customer }); 
 <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> <div class="row listrow" ng-repeat="customer in customers | orderBy: customer.id"> <div class="col-lg-8"> <p class="customer" ng-bind="customer.id + ' ' + customer.firstname + ' ' + customer.lastname"> </p> </div> </div> 

В этом случае ответ будет пустым, поскольку соединение с базой данных отсутствует. Для создания полного примера тестирования здесь приведены некоторые данные JSON вы можете использовать из таблицы customers .

 {"customers":{"customer":[{"id":"1","id_default_group":"0","id_lang":"0","newsletter_date_add":"0000-00-00 00:00:00","ip_registration_newsletter":{},"last_passwd_gen":"2017-10-30 09:27:03","secure_key":{},"deleted":"0","passwd":"$2y$10$eZvPTD9bkxwSfWN7qovrmee\/Den2TqZ5a6YjcGC\/lha3oU59MCjOO","lastname":"TestStefans","firstname":"John","email":"pub@prestashop.com","id_gender":"0","birthday":"0000-00-00","newsletter":"0","optin":"0","website":{},"company":{},"siret":{},"ape":{},"outstanding_allow_amount":"0.000000","show_public_prices":"0","id_risk":"0","max_payment_days":"0","active":"1","note":{},"is_guest":"0","id_shop":"1","id_shop_group":"1","date_add":"2017-04-26 14:01:31","date_upd":"2017-10-27 15:56:54","reset_password_token":{},"reset_password_validity":"0000-00-00 00:00:00","associations":{"groups":{"@attributes":{"nodeType":"group","api":"groups"},"group":{"id":"3"}}}},{"id":"2","id_default_group":"0","id_lang":"1","newsletter_date_add":"0000-00-00 00:00:00","ip_registration_newsletter":{},"last_passwd_gen":"2017-10-27 15:56:55","secure_key":{},"deleted":"0","passwd":"$2y$10$C8M6TIuzmZjP9kh06Hai8.XyuNG9WcSi9L34oXqAuidsJkoYog4WW","lastname":"Demoers","firstname":"Demoers","email":"demo@sdwebdesign.nl","id_gender":"0","birthday":"0000-00-00","newsletter":"0","optin":"0","website":{},"company":{},"siret":{},"ape":{},"outstanding_allow_amount":"0.000000","show_public_prices":"0","id_risk":"0","max_payment_days":"0","active":"1","note":{},"is_guest":"0","id_shop":"1","id_shop_group":"1","date_add":"2017-04-26 14:01:33","date_upd":"2017-10-27 15:56:55","reset_password_token":{},"reset_password_validity":"0000-00-00 00:00:00","associations":{"groups":{"@attributes":{"nodeType":"group","api":"groups"},"group":{"id":"3"}}}}]}} 

Поэтому с этой информацией здесь возникает мой вопрос:

При работе над приложением в таблице stock_availables приводятся следующие данные.

Таблица Stock_availables

Поэтому, используя функции $http.get() и функции response я смог создать форму для обновления запаса. Но теперь взгляните на id_product_attribute . Эта row соответствует product_attribute . В этом случае размер или цвет. Теперь я хотел бы отфильтровать эти результаты. В этом случае, используя, например, ng-if="id_product_attribute == 0" я могу фильтровать таким образом, чтобы отображались только все с этим id_attribute . Но я хотел бы показать их все. Итак, также с id = «1», id = «2» и т. Д. Но есть, где мне интересно, есть ли способ сделать это достаточно, чтобы не требовать ng-if для каждого id? Поскольку существует около 50 различных id_attribute , каждый из которых соответствует цвету или размеру. Таким образом, есть функция, которая может получить каждый другой идентификатор и фильтр, который будет достаточным, чем использование многих предложений ng-if . Посмотрите на следующий полный код в качестве примера.

 myApp.controller('ProductsController', function($scope, $http){ $http.get('config/get/getProducts.php', {cache: true}).then(function(response){ $scope.products = response.data.products.product }); // Stock check + view $http.get('config/get/getStock.php', {cache: true}).then(function (response) { $scope.stock_availables = response.data.stock_availables.stock_available }); // Update Stock $scope.updateStock = function(stock_available) { var stock_id = stock_available.id; var product_id = stock_available.id_product; var stock_quantity = stock_available.quantity; console.log(stock_id + product_id + stock_quantity); // Post to the database // }; }); 
 <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> <div class="row listrow"> <div class="col-lg-12 col-md-12 col-sm-12 col-xs-12"> <ng-form name="stock"> <div ng-repeat="stock_available in stock_availables"> <div class="row full-width padding-tb-15" ng-if="stock_available.id_product == product.id && stock_available.id_product_attribute == 0" ng-repeat="product in products"> <div class="col-lg-12 form-stock-group hidden"> <input title="id" type="text" name="stockId" class="form-control" aria-describedby="" ng-value="stock_available.id"> </div> <div class="col-lg-4"> <h5 ng-bind="product.name.language"></h5> </div> <div class="col-lg-3"> <h5 ng-bind="product.ean13"></h5> </div> <div class="col-lg-2"> <h5 ng-bind="product.reference"></h5> </div> <div ng-if="stock_available.id_product == product.id && stock_available.id_product_attribute == 0" ng-repeat="stock_available in stock_availables" class="col-lg-1 text-center"> <input title="stock_id" type="text" name="stock_id" class="form-control hidden" aria-describedby="" ng-model="stock_available.id" ng-value="stock_available.id"> <input title="stock_id_product" type="text" name="stock_id_product" class="form-control hidden" aria-describedby="" ng-model="stock_available.id_product" ng-value="stock_available.id_product"> <h5 title="quantity" name="stockQuantity" aria-describedby="" ng-model="stock_available.quantity" ng-bind="stock_available.quantity"></h5> </div> <div ng-if="stock_available.id_product == product.id && stock_available.id_product_attribute == 0" ng-repeat="stock_available in stock_availables" class="col-lg-1 text-center"> <input title="updateStockAmount" class="form-control form-control-stock" type="number"> </div> <div class="col-lg-1 text-center"> <a ng-click="printStockLabel()"> <i class="fa fa-print" aria-hidden="true"></i> </a> </div> </div> </div> </ng-form> </div> </div> 

Я пытаюсь создать следующее представление:

  1. Идентификатор продукта 1: тогда все размеры, цвет и т. Д.
  2. Product-id 2: затем все размеры, цвет и т. Д.

Простой дизайн

Да, это возможно при написании 50 различных утверждений ng-if но я спрашиваю, есть ли лучший, более простой и достаточный способ сделать это?

Простую сборку фиктивного кода можно найти здесь

Как всегда,

Заранее спасибо!

Related of "фильтрация в ng-повторе от ответа JSON"

Рассматривали ли вы использование базы данных и позволяете БД генерировать конкретный запрос для этого экрана, который объединяет все продукты в одну строку ?.

поэтому в настоящее время у вас есть куча «повторных» идентификаторов продуктов (поскольку запрос возвращает подробную информацию о цвете и размере), но вам необходимо работать с одной записью.

Вы можете сделать это в бэкэнд, используя оператор запроса GROUP BY SQL.

Если конечная точка используется другими программами, просто сделайте свою конечную точку «только для этого экрана» и примените необходимые изменения.

Если смена SQL на бэкэнде слишком сложна (или политически небезопасна), вы всегда можете group_by использовать javascript:

https://www.consolelog.io/group-by-in-javascript

group_by принимает в качестве ввода набор данных и столбец (т.е.).

учитывая набор данных, например:

 c1 c2 c3 1 10 10 1 11 10 3 12 20 // this operation: groups = group_by(dataset, "c1") //returns this: groups: group 1 (2 elements) c2 c3 10 10 11 10 group 3 (1 element) c2 c3 12 10 

это означает, что вы можете подать сгруппированный набор данных обратно в сетчатую программу, чтобы он мог отображать группы как группы и элементы как элементы, итерации сначала по группам, а затем по элементам.

Существует множество способов реализации group_by, например:

Каков наиболее эффективный метод группировки по массиву javascript объектов?

НТН

Возможно, вы должны спросить себя, какая часть вашего приложения несет ответственность за сортировку этих атрибутов. Это может привести к более очевидному решению для вас. Если ответственность за API API, то ваш запрос или ваш API должны вернуть готовый к использованию JSON для вашего WebApp. Если ответственность лежит на переднем WebApp, либо сделайте это в коде js, либо в шаблоне.

Я предполагаю, что ваш API должен это сделать, и в этом случае я не могу быть самым советником. Но если вы решите сделать это в WebApp, я определенно думаю, что вы не должны использовать ngIf для этого, но вместо этого создавайте Pure Functions в своем JS для создания одного или нескольких массивов, которые вы сможете использовать с не слишком большим количеством Функциональный код в шаблоне.

Например, вы могли бы .map () ответить и вернуть нужный объект и / или скопировать его с помощью .concat () или что-то еще. Если вам нужны идеи для создания таких функций, проверьте эти примеры http://reactivex.io/learnrx/

Читая свой вопрос, я бы предложил вместо ng-if n раз, у вас может быть логика фильтрации внутри вашего контроллера, например

  $scope.getFilteredList = function() { return $scope.stock_availables.filter(function(stock) { return stock.id_product === $scope.selectedID; // $scope.selectedID will be the id to be filter, in your example '0' }); } 

И ваш ng-repeat будет изменен как

 <div ng-repeat="stock_available in getFilteredList"> 

Я думаю, вам лучше позволить БД заказать его для вас. Но вы можете попробовать AngularJS orderBy или фильтр

 var module = angular.module('MyApp', []); module.controller('MyController', function($scope){ $scope.list = [ { 'id': 0, 'count': 10 }, { 'id': 1, 'count': 9 }, { 'id': 2, 'count': 8 }]; }); 
 <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> <div ng-app="MyApp"> <div ng-controller="MyController"> <div ng-repeat="member in list | orderBy:'-count'"> {{member.id}} </div> <hr> <div ng-repeat="member in list | filter: {id:0}"> {{member.id}} </div> <hr> <div ng-repeat="member in list | orderBy: '-count' | filter: {id : '!0'}"> {{member.id}} </div> </div> </div> 

Я также предложил бы использовать запрос db, чтобы обеспечить упорядочение ваших элементов. Однако у нас не всегда есть доступ к изменению бэкэнд или тому, как он функционирует.

ТАК ..

Я бы предложил использовать функцию сортировки для преобразования ваших данных ответа перед установкой $scope.customers

 $http.get('config/get/getCustomers.php', { cache: true }).then(function (response) { var temp = response.data.customers.customer; temp.sort(fucntion (item1, item2) { if (item1.product === item2.product) { if (item1.size === item2.size) { return item1.color > item2.color; } return item1.size > item2.size; } return item1.product > item2.product; } $scope.customers = temp });