#javascript #angularjs #list #ionic-framework #ng-repeat
#javascript #angularjs #Список #ionic-framework #angularjs-ng-repeat
Вопрос:
Я использовал директиву ng-repeat для отображения огромного списка в моем приложении ionic и недавно переключился на collection-repeat. Однако с повторением списка коллекций он стал довольно коротким и не отображает все элементы массива. В коде я только меняю collection-repeat на ng-repeat, и он работает так, как ожидалось. Кстати, я пытаюсь использовать его в определении директивы, которое является angucomplete, и в директиве я обычно фильтрую данные, вот соответствующие html и js:
'<div class="angucomplete-holder">'
'<input id="{{id}}_value" ng-model="searchStr" type="text" placeholder="{{placeholder}}" class="{{inputClass}}" onmouseup="this.select();" ng-focus="resetHideResults()" />'
'<ion-scroll direction="y" id="{{id}}_dropdown" class="angucomplete-dropdown" ng-if="showDropdown">'
'<div class="angucomplete-searching" ng-show="searching">Searching...</div>'
'<div class="angucomplete-searching" ng-show="!searching amp;amp; (!results || results.length == 0)">No results found</div>'
'<div class="angucomplete-searching" ng-show="!searching amp;amp; (!results || results.length == 0)">{{noResultMsg}}</div>'
'<div class="angucomplete-searching" ng-show="!searching amp;amp; (!results || results.length == 0)"><img src="img/title_icon.png" style="width:30px;height:30px;"/></div>'
'<div class="angucomplete-row" collection-repeat="result in results track by $index" ng-mousedown="selectResult(result)" ng-class="{'angucomplete-selected-row': $index == currentIndex}">'
'<div ng-if="imageField" class="angucomplete-image-holder">'
'<img ng-if="result.image amp;amp; result.image != ''" ng-src="{{result.image}}" class="angucomplete-image"/>'
'<div ng-if="!result.image amp;amp; result.image != ''" class="angucomplete-image-default"></div>'
'</div>'
'<div class="angucomplete-title" ng-if="matchClass" ng-bind-html="result.title"></div>'
'<div class="angucomplete-title" ng-if="!matchClass">{{ result.title }}</div>'
'<div ng-if="result.description amp;amp; result.description != ''" class="angucomplete-description">{{result.description}}</div>'
'</div>'
'</ion-scroll>'
'</div>',
и вот js:
isNewSearchNeeded = function(newTerm, oldTerm) {
return newTerm.length >= $scope.minLength amp;amp; newTerm != oldTerm
}
$scope.processResults = function(responseData, str) {
if (responseData amp;amp; responseData.length > 0) {
$scope.results = [];
var titleFields = [];
if ($scope.titleField amp;amp; $scope.titleField != "") {
titleFields = $scope.titleField.split(",");
}
for (var i = 0; i < responseData.length; i ) {
// Get title variables
var titleCode = [];
for (var t = 0; t < titleFields.length; t ) {
titleCode.push(responseData[i][titleFields[t]]);
}
var description = "";
if ($scope.descriptionField) {
description = responseData[i][$scope.descriptionField];
}
var imageUri = "";
if ($scope.imageUri) {
imageUri = $scope.imageUri;
}
var image = "";
if ($scope.imageField) {
image = imageUri responseData[i][$scope.imageField];
}
var text = titleCode.join(' ');
if ($scope.matchClass) {
var re = new RegExp(str, 'i');
var strPart = text.match(re)[0];
text = $sce.trustAsHtml(text.replace(re, '<span class="' $scope.matchClass '">' strPart '</span>'));
}
var resultRow = {
title: text,
description: description,
image: image,
originalObject: responseData[i]
}
$scope.results[$scope.results.length] = resultRow;
}
} else {
$scope.results = [];
}
}
$scope.searchTimerComplete = function(str) {
// Begin the search
if (str.length >= $scope.minLength) {
if ($scope.localData) {
var searchFields = $scope.searchFields.split(",");
var matches = [];
for (var i = 0; i < $scope.localData.length; i ) {
var match = false;
for (var s = 0; s < searchFields.length; s ) {
match = match || (typeof $scope.localData[i][searchFields[s]] === 'string' amp;amp; typeof str === 'string' amp;amp; $scope.localData[i][searchFields[s]].toLowerCase().indexOf(str.toLowerCase()) >= 0);
}
if (match) {
matches[matches.length] = $scope.localData[i];
}
}
$scope.searching = false;
$scope.processResults(matches, str);
} else {
$http.get($scope.url str, {}).
success(function(responseData, status, headers, config) {
$scope.searching = false;
$scope.processResults((($scope.dataField) ? responseData[$scope.dataField] : responseData ), str);
}).
error(function(data, status, headers, config) {
console.log("error");
});
}
}
}
$scope.hideResults = function() {
$scope.hideTimer = $timeout(function() {
$scope.showDropdown = false;
}, $scope.pause);
};
$scope.resetHideResults = function() {
if($scope.hideTimer) {
$timeout.cancel($scope.hideTimer);
};
};
$scope.hoverRow = function(index) {
$scope.currentIndex = index;
}
$scope.keyPressed = function(event) {
if (!(event.which == 38 || event.which == 40 || event.which == 13)) {
if (!$scope.searchStr || $scope.searchStr == "") {
$scope.showDropdown = false;
$scope.lastSearchTerm = null
} else if (isNewSearchNeeded($scope.searchStr, $scope.lastSearchTerm)) {
$scope.lastSearchTerm = $scope.searchStr
$scope.showDropdown = true;
$scope.currentIndex = -1;
$scope.results = [];
if ($scope.searchTimer) {
$timeout.cancel($scope.searchTimer);
}
$scope.searching = true;
$scope.searchTimer = $timeout(function() {
$scope.searchTimerComplete($scope.searchStr);
}, $scope.pause);
}
} else {
event.preventDefault();
}
}
$scope.selectResult = function(result) {
if ($scope.matchClass) {
result.title = result.title.toString().replace(/(<([^>] )>)/ig, '');
}
$scope.searchStr = $scope.lastSearchTerm = result.title;
$scope.selectedObject = result.title;
$scope.showDropdown = false;
$scope.results = [];
//$scope.$apply();
}
var inputField = elem.find('input');
inputField.on('keyup', $scope.keyPressed);
elem.on("keyup", function (event) {
if(event.which === 40) {
if ($scope.results amp;amp; ($scope.currentIndex 1) < $scope.results.length) {
$scope.currentIndex ;
$scope.$apply();
event.preventDefault;
event.stopPropagation();
}
$scope.$apply();
} else if(event.which == 38) {
if ($scope.currentIndex >= 1) {
$scope.currentIndex --;
$scope.$apply();
event.preventDefault;
event.stopPropagation();
}
} else if (event.which == 13) {
if ($scope.results amp;amp; $scope.currentIndex >= 0 amp;amp; $scope.currentIndex < $scope.results.length) {
$scope.selectResult($scope.results[$scope.currentIndex]);
$scope.$apply();
event.preventDefault;
event.stopPropagation();
} else {
$scope.results = [];
$scope.$apply();
event.preventDefault;
event.stopPropagation();
}
} else if (event.which == 27) {
$scope.results = [];
$scope.showDropdown = false;
$scope.$apply();
} else if (event.which == 8) {
$scope.selectedObject = null;
$scope.$apply();
}
});
Любая помощь будет оценена. Спасибо…