AngularJS: ng-modèle de commutation de type int en string

Je suis actuellement en train de travailler sur une application Angulaire. Jusqu'à présent, tout va tout à fait bien. Je suis vraiment, vraiment nouveau angulaire et je suis étonné de voir qu'il a fallu si longtemps pour que le premier véritable obstacle.

Situation:

J'ai un tableau d'objets, chacun avec une commande.

category.items = [{id: 1, order: 1, type: {}, ...}, {id: 54, order: 2, type: {}, ...}, {id: 3, order: 3, type: {}, ...}]

L'utilisateur doit être en mesure de réorganiser ces éléments. La nouvelle commande doit être réglée à la propriété de l'objet "commande".

En html ces objets sont rendus comme suit:

<div class="category">
    <div class="item" ng-repeat="(itemIndex, item) in category.items track by $index">
        <div class="header">
        </div>
    </div>
</div>

Dans l'en-tête de la div, j'ai un inputfield, de type select.

<select ng-model="item.order"  ng-change="changeItemOrder((itemIndex + 1), item.order, itemIndex)">
  <option ng-repeat="item in category.items" ng-value="($index + 1)">{{$index + 1}}</option>
</select>

Le code pour changeItemOrder:

$scope.changeItemOrder = function(old_order, new_order, item_index) {
    new_order = parseInt(new_order);
    if (old_order != new_order) {
        var upper = Math.max(old_order, new_order);
        var lower = Math.min(old_order, new_order);

        angular.forEach($scope.category.items, function(item, key) {
            if (item_index != key) {
                if (new_order < old_order) {
                    if (item_index >= new_order && (key + 1) >= lower && (key + 1) <= upper) {
                        item.order = (parseInt(item.order) + 1);
                    }
                } else if (new_order > old_order) {
                    if (item_index <= old_order && (key + 1) <= upper && (key + 1) >= lower) {
                        item.order = (parseInt(item.order) - 1);
                    }
                }
            } else {
                item.order = parseInt(new_order);
            }
        });

        $scope.reorderItems();
    }
};

(ReorderItems appelez simplement angulaire de tri avec un mécanisme de tri par défaut en comparant les commandes et le retour de -1, 1 ou 0.)

C'est là que j'ai découvert/repéré/identifié l'un de la rupture de bugs dans l'une des solutions possibles à ce problème. Ici, j'ai remarqué que mon INT est converti en chaîne en quelque sorte, comme sur le rendu d'une option est ajoutée à la liste déroulante avec la valeur "de la chaîne:2'.

J'ai essayé ng-options, de toutes les façons possibles, mais même ceux qui conduit à des problèmes.
La façon dont je l'ai ng-options a été en faisant l'élément.afin que l'article.de l'ordre dans ... et ainsi de suite, qui vient de faire la commande de l'interrupteur jusqu'en quelque sorte tous les éléments avaient le même ordre. L'essai de différentes méthodes de regroupement ou trackbys juste donné les différents bugs, comme si tout à coup l'introduction NaN fr NULL dans la liste déroulante, ou d'enlever complètement de l'ordre de propriété de l'objet-objet.

Jusqu'à présent, le moins de bogues solution a été d'utiliser le ng-repeat sur mes options. Qui provoque un décalage sur le type d'élément.ordre.

Maintenant, après avoir cherché loin, passer des heures sur stackoverflow (surtout avant la rédaction de cette question avec ce chouette petit question de recherche de truc), je viens à vous.

  1. Comment puis-je arrêter/contourner le comportement où mon élément.l'ordre est passé de INT en STRING?
  2. Si ce n'est pas possible, comment puis-je forcer mon $index à une chaîne, de sorte que le modèle(chaîne de caractères) correspond à la valeur(chaîne de caractères)
  3. Si ce n'est pas possible, comment puis-je écrire mon ng-options de façon à ce que je obtenir le comportement que je veux? ( J'ai essayé beaucoup de choses, de la voie par différents que pour les états, tous ont abouti à différentes bugs)

    Au chargement initial, et tout sélectionne afficher une valeur correcte sélectionnée, de sorte que tous les éléments.de l'ordre sont initialement INT (je les obtenir à partir de notre API), c'est seulement après l'interaction de tous, mais l'objet qui a déclenché l'réorganiser obtenir baisé vers le haut.

Garder la trace de la commande de cette manière n'est pas vraiment nécessaire. Dans angulaire, le modèle est la source de la vérité. Vous avez déjà le tableau de données - lorsque vous insérer/supprimer des éléments dans le tableau, vous êtes implicitement re-commander le modèle.
vous avez raison, cependant, dire que je suis pour changer d'élément à l'espace de 5 à espace 2, comment voudriez-vous faire, diviser le tableau au point d'insertion, de mettre en valeur entre les deux et les ajouter de nouveau? Aussi, ce qui ajoute à la difficulté, j'ai besoin d'être en mesure de sauver les questions séparément, puis je n'ai besoin de l'article.ordre. J'ai pu "figure it out" sur l'aller et le pousser à l'objet, mais en faisant ce que vous pourriez aussi bien le conserver et l'utiliser de l'omi.
Utilisation arr.splice retirer et insérer l'élément
Une fois l'insert qui se passe, envoyer une mise à jour du serveur en même temps avec la nouvelle $index de l'élément. Ou vous pouvez également envoyer l'ensemble de la matrice vers le serveur à la fin.
bon, je vais suggérer que le pouvoir en place, et probablement le résoudre comme ça. Je vais juste changer quelques choses serverside pour faire ce travail. Merci beaucoup!

OriginalL'auteur thisisboris | 2014-07-18