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.
- Comment puis-je arrêter/contourner le comportement où mon élément.l'ordre est passé de INT en STRING?
- 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)
- 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.
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
Vous devez vous connecter pour publier un commentaire.
Il est changé de chaîne, car le HTML n'a pas de notion de ce qu'est un entier. En fin de compte les variables sélectionnées sont lues à partir du DOM et remis angulaire et donc il change son type.
Vous pouvez forcer le modèle à toujours contenir un nombre entier avec une directive
(plunk)
Mais je vois quelqu'un l'a déjà souligné qu'il pourrait y avoir de meilleures façons de garder une trace de la commande. FWIW que la directive aura au moins le garder s'assurant que le modèle n'est jamais une chaîne de caractères.
Bon, je suppose que je n'ai pas bien compris votre contexte. Il sera exécuté à deux fois chaque fois qu'il change la valeur, car le changement de la valeur il déclenche à nouveau. C'est une formidable façon d'épuiser la pile si vous n'êtes pas prudent. Une directive comme cela encore vous donne le pouvoir de contrôler ce qui se passe lorsque les changements de modèle (et avec son frère, le
$formatter
peut fournir une bonne distinction entre modèle et de la vue). Je suppose que ce n'était pas le bon outil.J'ai utilisé cette approche pour une color-picker et de la transparence-curseur de sorte qu'il def. travail dans certains cas où vous souhaitez garder le contrôle sur la valeur, tandis que ne pas répondre à cette question précisément, je suis sûr que vous avez résolu tout à fait quelques autres de gens qui se tournent jusqu'ici par l'intermédiaire de Google. (si cela arrive jamais)
Vous seriez surpris de voir combien souvent les gens à retrouver sur DONC lors d'une recherche via Google. C'est une ressource impressionnante qui m'a aidé un nombre incalculable de fois. Bienvenue sur le site par le chemin, et je suis heureux de voir que vous avez trouvé une solution à la fin.
OriginalL'auteur ivarni
Finalement, j'ai été en mesure de résoudre ce problème en faisant:
Cela, et seulement cette solution (pour l'instant) a ce que j'ai envie/besoin. J'ai besoin de l'article.modèle de garder une trace de la position actuelle et de montrer la valeur correcte sur la charge initiale. Vous ne pouvez pas définir le modèle de questionIndex parce que cela dérange les autres HTML-éléments, je ne peux pas le régler à $index parce que aussi fait des choses étranges.
Tandis que les autres solutions suggérées ici "travail", ils ne se traduisent pas dans les specs qui m'a été donnée. Donc je suppose que c'est un peu spécifique.
OriginalL'auteur thisisboris
OriginalL'auteur ThulasiramSoft