#javascript #angularjs #arrays #ionic-framework #angular-ngmodel
#javascript #angularjs #массивы #ionic-framework #angular-ngmodel
Вопрос:
Я хочу создать список избранных в своем приложении на основе выбора пользователя. В моем приложении я использую длинный файл JSON с кучей текста, который загружается $http.get()
. Это код для отображения содержимого, на мой взгляд.
<ion-view>
<ion-nav-title></ion-nav-title>
<ion-content>
<div class="card" ng-repeat="list in items | filter: { id: whichid }">
<div class="item item-text-wrap"
ng-repeat="item in list.content | filter: { id2: whichid2 }"
ng-bind-html="item.description.join('')">
<h3>{{ item.name }}</h3>
<p>{{ item.description }}</p>
</div>
</div>
</ion-content>
Основная идея создания списка избранных — сохранить отображаемый текст в массиве. После этого я могу легко распечатать этот массив в шаблоне для списка избранных.
Итак, проблема в том, как я могу сохранить выражение формы текста / данных ({{ item.name }}, {{ item.description }})
в массив? Или, если у кого-нибудь есть другая идея для создания этого списка избранных.
Комментарии:
1. Как насчет функции внутри контроллера angular, которая добавляет новый элемент в массив?
Ответ №1:
Передайте сведения об элементе функции, определенной в вашем контроллере, с помощью ng-click и поместите его в массив, как показано ниже :
<ion-view>
<ion-nav-title></ion-nav-title>
<ion-content>
<div class="card" ng-repeat="list in items | filter: { id: whichid }">
<div class="item item-text-wrap" ng-click="favouriteThis(item)"
ng-repeat="item in list.content | filter: { id2: whichid2 }"
ng-bind-html="item.description.join('')">
<h3>{{ item.name }}</h3>
<p>{{ item.description }}</p>
</div>
</div>
</ion-content>
В вашем контроллере :
Напишите функцию «Favoritethis», чтобы нажимать на избранный элемент каждый раз, когда пользователь нажимает на него :
$scope.favouriteList = [];
$scope.favouriteThis = function (item) {
$scope.favouriteList.push(item); // make sure to check for duplicates before pushing the item, the logic for which i've not included here.
}
Поскольку у вас есть все сведения о избранных элементах в «$scope.favoritelist», вы можете использовать эту информацию непосредственно в своем списке избранных. Чтобы сделать его более точным, при проверке на наличие дубликатов вы также можете записать количество раз, когда пользователь взаимодействовал с определенным элементом, используя который, вы можете показать наиболее взаимодействующий элемент в верхней части списка.
Надеюсь, это поможет 🙂
Комментарии:
1. Спасибо, это отличное решение :). Но как я могу вызвать функцию favoritethis (item) вне ng-repeat? Например, если я хочу использовать эту функцию в заголовке?
2. Почему вы хотите вызвать его из-за пределов ng-repeat? Вы не сможете записать детали элемента, если он находится снаружи. Если вы поместите его за пределы ng-repeat, вы не знаете, когда записывать щелчок и какой элемент нажат.
3. Еще раз спасибо, я разобрался, и теперь все работает 🙂
Ответ №2:
Я бы предложил создать сервис / контроллер для этого подхода, поскольку вы выполняете http-вызовы, которые возвращают объекты JSON (используйте сервис, а также контроллер). В службе есть свои функции, такие как getFavorites, addToFavorites, deleteFromFavorites и т.д. Эти функции будут http GET / POST / UPDATE в вашем списке избранных. Затем вы захотите вернуть объект JSON в контроллер. В контроллере вы будете иметь контроль над областью видимости и устанавливать переменные области видимости для отображения данных в вашем приложении.
Вот простой пример:
Обслуживание
//****************
//Favorite Factory
//****************
.factory('favoriteFactory', function ($http) {
var favFac = {};
var favorites = [];
favFac.getFavorites = function (userId) {
//$http.get() call to get specific user's favs
};
favFac.addToFavorites = function (name, description) {
//$http.post() call to post to a users favs
};
favFac.deleteFromFavorites = function(userId, itemId) {
//$http.update() call to delete item from users favs
}
return favFac;
});
Контроллер
//Favorite Controller
.controller('FavoritesCtrl', ['$scope', '$stateParams', 'favoriteFactory', function ($scope, $stateParams, favoriteFactory) {
//Route current user Id to controller. Pass to service to look up their favorites in db
var userId = $stateParams.id;
$scope.favorites = favoriteFactory.getFavorites(userId);
$scope.addToFavorites = function(name, description){
favoriteFactory.addToFavorites(name, description);
}
}])
HTML
<ion-view view-title="Favorites Page" ng-controller="FavoritesCtrl">
<ion-content>
<ion-item collection-repeat="favorite in favorites">
<h3>{{ favorite.name }}</h3>
<p>{{ favorite.description }}</p>
<button type="button" ng-click="addToFavorites(favorite.name, favorite.description)">Add</button>
</ion-item>
</ion-content>
Комментарии:
1. Спасибо за ответ 🙂