2013-07-01 7 views
10

È possibile ottenere valori predefiniti come ad esempio ''?AngularJS valore predefinito per ng-model

Ho un modulo su cui ho usato la funzione serialize di jQuery, e ogni volta che un valore non è presente, lo includerà comunque nei dati serializzati, es. {name: '', age: ''}.

Tuttavia, quando provo a utilizzare la registrazione mediante Angular $http e ottenere il modello da $scope, appare come undefined quando è vuoto.

+1

nel controller, prova ad aggiungere '$ scope.your_model_name_here = ''' –

+0

ho provato, ma che ha portato l'intero modello di essere una stringa vuota, e nemmeno un l'oggetto vuoto è stato creato. Tuttavia, inizializzando esplicitamente una proprietà alla volta come nella risposta di Shaunhusain funziona. – whirlwin

risposta

9

È possibile definire semplicemente le proprietà sul modello nell'ambito prima di utilizzarle nella vista.

Se viene visualizzato il codice del controller, verrà mostrato ciò che è necessario aggiornare per aggiungerli all'ambito.

Dovrebbe essere qualcosa di simile:

Nel file js che ha definito l'applicazione

angular.module("MyModule", []).controller('MyCtrl', ['$scope', function ($scope) { 
    $scope.myModel = {name:""}; 
}]); 

nel codice HTML

<input type="text" ng-model="myModel.name"/> 

Nota io non preferisco avere le variabili/funzioni globali quindi sto usando una sintassi diversa fornita da Angular per evitare questo e per consentire la minimizzazione.

+0

Questa sembra essere la strada da percorrere, come per ora. – whirlwin

+0

Sì, sicuramente, ho ancora un po 'di noob angolare, ma lo sto usando con molto successo su tre progetti, uno su cui sto lavorando è il più grande finora, ma tutti gli stessi concetti si applicano indipendentemente dalla scala. Imparate solo a fare controllori, servizi e direttive e potete fare praticamente tutto, inoltre c'è già una comunità abbastanza grande e molti componenti fantastici (ng-grid, google-maps, per nominare una coppia). Non sono mai stato un ragazzo jQuery Sono saltato direttamente da AS3/Flex quindi è abbastanza familiare e pulito. Gli strappi sono per lo più intorno agli aggiornamenti di ambito per me. – shaunhusain

+0

Sì, non vedo l'ora di utilizzare Angular nei progetti futuri, al contrario di * only * jQuery. – whirlwin

1

Non è necessario utilizzare la serializzazione jQuery.

Il modulo dovrebbe essere vincolato al campo di applicazione in questo modo:

<form ng-controller="MyCtrl" ng-submit="submit()"> 
    <input type="text" name="name" ng-model="formData.name"> 
    <input type="text" name="age" ng-model="formData.age"> 
    <input type="submit" value="Submit Form"> 
</form> 

function MyCtrl($scope) { 
    $scope.formData = {}; 

    $scope.submit = function() { 
     $http.post('/someUrl', $scope.formData) 
    }; 
} 

In modo che nel $ http si può semplicemente passare $ scope.formData.

Is there a more effective way to serialize a form with angularjs?

+0

Questo è ciò che sto facendo attualmente. Tuttavia, il problema principale è che rimarrà un oggetto vuoto ('{}'), e non si preoccuperà dei valori indefiniti quando pronuncerai '$ scope.formData'. Quello di cui ho bisogno è qualcosa che garantisca che i valori vuoti siano considerati. – whirlwin

+1

Oh capisco. Bene in questo caso definisci l'oggetto sul tuo scope in questo modo: $ scope.formData = {'name': null, 'age': null}; – StuR

10

Si può anche provare:

<div ng-init="foo={}"> 
    <input type="text" ng-model="foo.name=''"/> 
</div> 

o:

<input type="text" ng-init="foo.name=''"/> 

presenterà:

foo = { name: '', .... } 
+0

Grazie per questo. Questa è stata la soluzione migliore per la mia piccola applicazione in cui la creazione di un controller non è necessaria (ancora). – drj

+0

Felice di aiutare: D – Neaped

0

A volte, non si sa se il il valore è impostato o meno. Ecco a cosa servono i valori predefiniti.

Lo uso quando è necessario verificare che una variabile abbia un valore. È possibile impostare nel controller

$scope.possiblyEmptyVariable = $scope.possiblyEmptyVariable || "default value"; 

Opere grande senza angolare così

// some object that may or may not have a property 'x' set 
var data = {}; 

// Set default value of "default" 
// carefull, values like 'null', false, 0 will still fall to defaults 
data.x = data.x || "default"; 

// Set default value of "default" 
// this will not fall to defaults on values like 'null', false, 0 
data.x = !"x" in data || "default"; 

Se è necessario impostare un gruppo di valori, utilizzare angular.extend o jQuery.estendere

data.z = "value already set"; 
var defaults = { x: "default", y: 1, z: "default" }; 
var newData = angular.extend({}, defaults, data); 
// { x: "default, y: 1, z: "value already set" } 

Speranza che aiuta

Problemi correlati