7
votes

knockout - exécuter le code après que le dernier élément a été rendu

J'utilise JQuery QuickSearch pour rechercher une table qui est peuplée par Knockout foreach boucle. L'élément QuickSearch doit être initié après les finitions de Foreach forts>. J'ai essayé plusieurs approches, mais j'ai échoué jusqu'à présent.

J'ai essayé d'utiliser "AfterRender", mais n'a pas pu déterminer si l'élément actuel est le dernier élément de la collection, J'ai également essayé d'utiliser un reliant, mais j'ai eu une collection de longueur 0 au lieu de longueur 2005. P>

SO: P>

  1. Quelle est la meilleure approche pour trouver le dernier élément d'une boucle de foresach? Li>
  2. Quelle est la meilleure façon de le mettre en œuvre dans ce scénario spécifique? LI> ol>

    Voici mon point de vue: p>

    function Container(data) {
            var self = this;
            self.id = ko.observable(data.Id);
            self.code = ko.observable(data.Code);
            self.typeName = ko.observable(data.TypeName);
            self.parentClient = ko.observable(data.ParentClient);
            self.client = ko.observable(data.Client);
            self.deleteUrl = ko.computed(function () {
                return "GetModal('/Containers/Delete/" + data.Id + "','containerModal');";
            });
            self.editUrl = ko.computed(function () {
                return '/Containers/Edit/' + data.Id;
            });
    
            self.qrUrl = ko.computed(function () {
                return '/Qr/Index/10?entity=' + data.Id;
            });
        }
     function ContainersViewModel() {
            var self = this;
            self.containers = ko.observableArray([]);
            self.counter = ko.computed(function () {
                return self.containers().length;
            });
    
            $.getJSON("/Containers/Json", function (data) {
                var containers = $.map(data, function (item) {
                    return new Container(item);
                });
    
                self.containers(containers);
            });
    
        };
        ko.applyBindings(new ContainersViewModel());
    


0 commentaires

5 Réponses :



1
votes

Utiliser l'extension des gaz, cette voie calculée sera appelée une fois après avoir fini de remplir le tableau:

  self.counter = ko.computed(function () {
        return self.containers().length;
    }).extend({ throttle: 100 });


1 commentaires

J'aime cette réponse. Si simple et ce dont je devais résoudre un problème similaire de la colonne de table, l'équilibrage de la colonne de table après chaque rangée a été rendue. Merci!



4
votes

L'option de fixation de la liaison de Foreach peut faire ce que vous recherchez, la partie astuce est de pouvoir savoir que l'élément est le dernier. Cela peut être résolu à l'aide des arguments fournis comme indiqué dans http://jsfiddle.net/n54xd/ .

La fonction: xxx

sera appelée à chaque élément, mais le "si" s'assurera que le code ne fonctionne que pour le dernier élément.


2 commentaires

Merci Ricardo!, Je l'ai essayé, mais cette expression: Des pensées ?


Mon mauvais - j'ai écrit accidentellement la fonction juste à l'extérieur de la vue de la vue elle-même (une chose du matin ..) Merci!



2
votes

J'ai réussi à utiliser la réponse de Ricardo Medeiros Penna avec un seul petit Tweak. XXX

Je devais ajouter _LatestValue pour obtenir la valeur de la longueur et que cela fonctionne maintenant.


1 commentaires

_LatestValue étant une variable privée. Pas sûr s'il serait prudent d'y accéder directement. Ainsi, en utilisant ceci.foreach () à la place. Pas vraiment une grande différence tho this.mypostprocessingLogic = fonction (éléments, données) {var sicheingarray = ceci.foreach (); Si (sous-planifié [sous-créatiry.lengthreength - 1] === Données) Console.log ("liste est rendue"); };



1
votes

Addenda tardive, mais la déclaration IF dans la réponse de Ricardo ci-dessus devrait être:

if (this.foreach()[this.foreach().length - 1] === data) {
    //Your post processing logic
}


1 commentaires

Eh bien, c'est un peu en retard (5 ans, donner ou prendre), mais semble légitime. Merci!