2014-10-01 7 views
11

Ho una semplice applicazione grezza in Angular (1.2) e Laravel (4.2). Per semplici operazioni CRUD uso efficiente metodo Eloquent:Perché i set angolari non sono definiti per i campi vuoti del modello ng

$product->fill(Input::all()); 

che prende tutti i campi richiesta payload, ma c'è un problema quando ho bisogno di fare modello di aggiornamento con i campi vuoti.

Nel azione di modifica Ho una forma che è pieno di risposta di $ risorsa metodo get del mio servizio:

adminModule.factory 'Product', ($resource) -> 
    $resource '/admin/products/:id', { id: '@id' }, { 
    query: { method: 'GET', isArray: false } 
    update: { method: 'PUT' } 
    } 

un controller:

adminModule.controller 'ProductFormEditController', ($scope, Product, $stateParams) -> 

    $scope.formData = Product.get({id: $stateParams.id}) 

e html:

<input type="text" data-ng-model="formData.name" name="name" class="form-control" id="name" 
          placeholder="Nazwa" data-server-error required> 

Se cancello questo valore di campo e invio il valore di $ scope.formData è impostato su undefined e non c'è n ot incluso nella richiesta PUT, quindi il metodo di riempimento del modello laravel non vede comunque il campo e non imposta il valore vuoto per la convalida, ma assume il valore originale del modello.

Il problema è: come posso inviare una stringa vuota da ngModel anziché non definita?

p.s. Se il tipo di input è textarea, la risorsa $ invia vuota stringa ""://, quindi sono confuso ...

risposta

14

Quando si ha la direttiva "required" su un input, non verrà mai impostato un valore vuoto (quindi sarà indefinito).

vedere il codice sorgente ("requiredDirective" in input.js file) in cui nessun valore viene recuperato per memorizzare nel modello, quando l'ingresso è vuoto:

if (attr.required && ctrl.$isEmpty(value)) { 
    ctrl.$setValidity('required', false); 
     return; 
    } else { 
     ctrl.$setValidity('required', true); 
     return value; 
} 

IMHO è un po 'strano caso d'uso comunque: si desidera la convalida del lato client, ma si desidera comunque inviare valori non validi al server, giusto?

Immagino che tu possa scrivere la tua convalida ("my-required") per farlo.

In alternativa si potrebbe copiare i valori di default prima di inviare i dati al server, ad esempio con lodash (o di sottolineatura):

_.defaults (formdata, {name: ""});

+0

devo l'attributo richiesto per l'ingresso causa convalida forma angolare ...E sì ho novalidate sul tag form che non aiuta –

+0

Sfortunatamente questo non è il modo in cui "richiesto" funziona in modo angolare. Vedi la mia risposta modificata. –

13

È possibile configurare angolare per impostare il modello anche quando il valore non è valido con la proprietà allowInvalid da ngModelOptions.

allowInvalid: valore booleano che indica che il modello può essere impostato con valori che non ha convalidato correttamente al posto del comportamento predefinito di impostare il modello da indefinito.

API Reference: https://docs.angularjs.org/api/ng/directive/ngModelOptions

Esempio:

<input 
    type="text" 
    ng-model="myvalue" 
    ng-model-options="{ allowInvalid: true }"/> 
+0

Perfezione - Mi chiedevo perché il mio modello fosse impostato su "indefinito", ogni volta che la mia convalida falliva! Questo risolve il problema. Grazie! –

Problemi correlati