Découper automatiquement les espaces de toutes les valeurs observables
J'ai un ViewModel dans knock-out qui proviennent principalement de la cartographie plugin (c'est à dire, de façon dynamique). Cela fonctionne très bien. Cependant, maintenant, mon client veut de moi, assurez-vous que toutes les entrées ont des espaces coupées avant de les soumettre au serveur. De toute évidence, la garniture code est très simple, mais relativement nouvelle à élimination directe, je ne suis pas sûr exactement où placer ce code. J'ai lu sur rallonges, mais qui semble assez verbeux et répétitif pour revenir en arrière et ajouter que, pour chaque observable. En Plus je ne suis même pas sûr que je peux le faire dynamiquement généré observables (la, la cartographie de l'extension).
Est-il un mécanisme central je peux prolonger/remplacer où je peux injecter une partie de règlage de code à chaque fois qu'un changement observable? Fondamentalement, je suis en essayant d'éviter les heures passent à travers tous nos formes et l'ajout spécial de liaison de syntaxe dans le code HTML si je n'ai pas à.
Grâce.
- Vous évoquez, ils ont seulement besoin d'être coupé avant de vous les présenter. Unmap vous observables à l'aide de ko.la cartographie.toJS(modèle), puis d'écrire un assistant de le répéter au travers de chaque propriété et de l'assiette.
- hm. c'est juste. peut-être que je vais essayer ça. bien que je souhaite qu'il y avait un moyen d'exécuter du code à chaque fois que l'observable mises à jour.
- FWIW, parce que je suis à court d'un validateur de changement d'entrée, je suis juste en cours d'exécution d'une fonction trim au début de l'.
- beaucoup de bonnes réponses, mais toujours rien qui fonctionne à travers le conseil d'administration sans passer par le code et la mise à jour de chaque observable sur chaque page. Avez-vous trouver un moyen de le faire automatiquement?
Vous devez vous connecter pour publier un commentaire.
J'ai eu le même problème. J'ai écrit une prolongation de sorte que vous pouvez appeler
trimmed
de votre point de vue-modèle sans avoir à changer vos fixations. Par exemple:L'extension:
Code est sur JSFiddle avec des exemples.
.extend({trimmed: true})
ou.extend({trimmed: null})
. De cette façon, est aussi plus propre en vous permettant d'appeler la fonction directement à partir de l'observable. Voir freshbrewedcode.com/joshbush/2011/12/27/....trim()
, correct? (c'est à dire pas IE7 ou IE8 support)jQuery.trim(s)
ous.replace(/^\s+|\s+$/g, '')
en place des.trim()
. Alternativement, vous pouvez ajouter votre propre polyfill pour le faire fonctionner à l'appui de ces navigateurs. Voir stackoverflow.com/questions/498970/...Juste au cas où quelqu'un vient sur ce problème avec les versions plus récentes de knock-out, l'actuel haut-rang réponse ne fonctionnera pas correctement.
Voici une mise à jour de violon et le code pour afficher les changements nécessaires:
Si quelqu'un sait pourquoi le
extend
est maintenant nécessaire, s'il vous plaît laissez-moi savoir. Il m'a fallu une éternité pour comprendre pourquoi ça ne fonctionnait pas correctement dans knock-out 3.1.0Vous pourriez écrire une liaison personnalisée qui rogne l'observable. Quelque chose de semblable à ce
http://jsfiddle.net/belthasar/fRjdq/
ko.mapping.fromJS(data, {}, viewmodel)
dans le.done()
fonction d'un appel ajaxÀ l'aide de Joe solution comme un point de départ, Nous avons mis en place juste un peu différemment.
Avis:
ko.observable()
n'a rien entre les parenthèsestrimmed
la fonction de lecture retourne simplementthis()
et ne pas être null ou undefined exceptions.Code du modèle:
L'extension:
Vous pouvez créer une liaison personnalisée qui appelle la
value
de liaison à l'interne, ou vous pouvez remplacer levalue
de liaison à l'auto-trim, avant de lie (non-recommandé).L'idée de base:
value
liaisoncomputed
read
etwrite
de la calculés au lieu de partir de l'original observablesJS:
HTML:
Si vous n'avez pas de soins sur certains inutiles
valueHasMutated
s dans votre modèleLa partie la plus délicate est de déterminer quelles mises à jour que vous souhaitez recevoir dans votre modèle... L'exemple ci-dessous va pas déclencher
valueHasMutated
ni muter votre modèle est observable. Cependant, si vous modifiez votre modèle de la valeur à un inculte de la chaîne, la liaison gestionnaire de réinitialiser instantanément. E. g.:myObs(" test ")
va déclencherChange: " test "
, etChange: "test"
Si vous avez seulement besoin de rognage de l'INTERFACE utilisateur pour le modèle, et ne me dérange pas de l'extra mises à jour, vous pouvez utiliser:
D'écraser la valeur par défaut
value
liaisonÀ utiliser ce comportement comme norme de comportement (pas recommandé), vous pouvez le faire:
JS:
HTML:
textInput
de liaison au lieu devalue
? Il garnitures sur lachange
événement qui doit se produire uniquement lorsque vous retirez le focus de lainput
. Si vous voulez mises à jour en direct, vous aurez besoin d'un peu plus de code...Une approche alternative qui fonctionne bien pour nous - trim lorsque le champ est modifié:
Le déclencheur de "modifier" l'événement assure KO ramasse le changement (testé avec un KO v2).