Peut-être que quelqu'un peut m'aider avec un petit problème. Je suis assez nouveau dans le domaine de la programmation web, mais j'ai une expérience en programmation. Je voudrais développer un petit site Web qui utilise angularjs et ui-grid. Malheureusement, le filtrage ne fonctionne pas à partir des champs de saisie externes.
Quelqu'un pourrait-il me dire où se trouve mon bug de programmation?
Le code peut être trouvé ici: http://plnkr.co/edit/fiA666OzpBqpTrCiuXER?p=preview
var myDummyData = [{name: "Moroni", age: 50},
{name: "Tiancum", age: 43},
{name: "Jacob", age: 27},
{name: "Nephi", age: 29},
{name: "Enos", age: 34}];
var myDummyData2 = [{name: "aTest", age: 50},
{name: "bTest1", age: 43},
{name: "cTest2", age: 27},
{name: "dTest3", age: 29},
{name: "eTest4", age: 34}];
$scope.filterOptions = {
filterText: ''
};
$scope.gridOpts = {
data: myDummyData,
enableFiltering: true,
columnDefs: [
{name: 'Name', field: 'name', enableFiltering: true
, filter: {
term: $scope.filterOptions.filterText //DOES NOT WORK... BUT WHY
}
},
{name: 'Price', field: 'age'}
]
};
$scope.updateData = function(newValue){
//console.log($scope.gridOpts.data);
console.log($scope.gridOpts.columnDefs[0].filter);
$scope.gridOpts.columnDefs[0].filter = {term: newValue};
console.log("Scope nameid set " + $scope.gridOpts.columnDefs[0].filter.term); //is set but no update
//$scope.$apply(); //not possible gives error! WHY??
//$scope.gridOpts.data = myDummyData; //for testing works
};
$scope.swapData = function () {
if ($scope.gridOpts.data === myDummyData) {
$scope.gridOpts.data = myDummyData2;
}
else {
$scope.gridOpts.data = myDummyData;
}
};
//DOES NOT WORK BUT WHY
// $scope.$watch('filterOptions.filterText', function (newValue, oldValue) {
// if ($scope.filterOptions.filterText) {
// $scope.filteringText = newValue;
// $scope.updateData(newValue);
// }
// });
L'idée est d'avoir une barre de navigation contenant un champ de recherche. Plus tard, je veux filtrer en fonction des rangeliders sur d'autres colonnes. Cependant, même le filtrage de chaîne standard ne fonctionne pas dans mon exemple.
Questions:
J'ai cherché des réponses, mais soit c'est directement un problème de liaison que je ne peux pas saisir, un simple problème de programmation js, ou une mise à jour ngGrid vers un problème ui-grid.
Merci beaucoup d'avance
La réponse à votre première question, ils n'ont pas encore vraiment fait une option de recherche globale pour l'UI-Grid, vous devez donc faire un peu de travail. Le mode de fonctionnement actuel des filtres de colonne est angular surveille le champ de saisie du filtre de colonne pour une modification, et lorsque vous tapez dans la zone, il actualise son filtre. Par conséquent, votre filtre ne s'appliquera que si vous forcez cette zone de saisie à déclencher l'événement de modification. La solution de contournement consiste simplement à filtrer les données et à les recharger. Par exemple:
Dans votre zone de recherche de saisie HTML, ajoutez une actualisation
<input ng-model="searchText" ng-change="refreshData()" placeholder="Search...">
puis dans votre app.js
$scope.refreshData = function() {
$scope.myGrid.data = $filter('filter')($scope.data, $scope.searchText);
};
oh, et n'oubliez pas d'inclure $ filter dans votre contrôleur
app.controller('myController', function($scope, $filter) {}
J'ai bifurqué votre exemple et l'ai modifié avec cette solution de contournement. Vérifiez-le ici: http://plnkr.co/edit/Tr9cNm0lDy62dmF7LNlr?p=preview
essaye ça:
$scope.gridOpts = {
data: myDummyData,
enableFiltering: true,
columnDefs: [
{name: 'Name', field: 'name', enableFiltering: true
, filter: {
noTerm: true,
condition: function(searchTerm, cellValue) {
return (cellValue+"" === $scope.filterOptions.filterText+"");
}
}
},
{name: 'Price', field: 'age'}
]
};
pour la zone de saisie: <input ng-model="searchText" ng-change="refresh()" placeholder="Search...">
$scope.refresh = function()
{
$scope.gridApi.core.refresh();
}
J'espère que ca fonctionne...