2017-05-19 2 views
1

Je ramène la collection du contrôleur à la directive. où je joins au modèle.Comment utiliser `ng-bind` dans la directive pour trier les valeurs

i nécessaire pour atteindre 2 choses ici

  1. la charge de la collection - que ce soit trié
  2. Le changement d'entrée, (changement de modèle) requried pour trier à nouveau les valeurs du tableau.

pour mon essai les deux ne fonctionne pas. Quelqu'un peut-il clarifier la question ici et régler le problème?

voici mon code:

app.directive("customGrid", function($timeout,$filter){ 
    return{ 
    scope:{ 
     "pages":"=" 
    }, 
    template:temp.join(''), 
    link : function(scope, element, attrs){ 
     scope.slice = null; 

     scope.sortIt = function(value){ 
     scope.pages.pin = $filter('orderBy')(value, ''); 
     console.log(scope.pages.pin); 
//consoles sorted not updating in view 
     scope.$apply(); 
     } 

     $timeout(function(){ 
     scope.slice = scope.pages.pin; 

     scope.sortIt(scope.slice); 

     }) 

    } 
    } 
}) 

Live Demo

+0

essayez-vous de trier l'élément dans le tableau même lorsque de nouveaux éléments à la matrice est ajouté ou supprimé? –

+0

Oui exactement requis pour re-trier chaque fois que le mode change – user2024080

+0

Pourquoi faites-vous le tri manuellement et ne laissez pas angulaire gérer en ajoutant le filtre à la 'ng-repeat =' (clé, valeur) dans les pages | limite à: 3: 1''? –

Répondre

1

Comment cela? En utilisant le tri angulaire natif avec son propre filtre, on passait aussi des objets entiers à la directive, car il peut être difficile d'y travailler avec trois tableaux plats séparés. plnkr

var temp = [ 
    "<ul><li ng-repeat='obj in slice | myOrder:obj:reverse'>", 
    "<input ng-model='obj.pin' type='text'/></li></ul>" 
    ] 

app.filter('myOrder', function() { 
    return function(items, field, reverse) { 
    var filtered = []; 
    angular.forEach(items, function(item) { 
     filtered.push(item); 
    }); 
    filtered.sort(function (a, b) { 
     return (parseInt(a.pin) > parseInt(b.pin) ? 1 : -1); 
    }); 
    if(reverse) filtered.reverse(); 
    return filtered; 
    }; 
}); 



app.directive("customGrid", function($timeout,$filter){ 
    return{ 
    scope:{ 
     "pages":"=" 
    }, 
    template:temp.join(''), 
    link : function(scope, element, attrs){ 
     scope.slice = null; 
     $timeout(function(){ 
     scope.slice = scope.pages; 
     console.log(scope.slice,scope.pages) 
     }) 


     //console.log(sorted); //not sorting 
    } 
    } 
}) 

EDIT Plnkr without orderBy Pourtant, il est difficile de dire sans connaître les détails & exigences du projet. Je peux dire, d'après notre propre expérience, il est souvent préférable d'utiliser des techniques de répétition virtuelle (ou, dans le cas des tables, des scripts vanilla dédiés qui fonctionnent avec Angular).

+0

La raison principale est d'éviter le nombre de '$ watchers' - ce que j'ai posté est un petit morceau de données. J'ai un énorme ensemble de données. – user2024080