2013-07-01 13 views
10

Czy można uzyskać wartości domyślne, takie jak ''?Wartość domyślna AngularJS dla modelu ng

Mam formularz, w którym użyłem funkcji jQuery's serialize, a ilekroć wartość nie jest obecna, nadal będzie zawierała ją w danych zserializowanych, np. {name: '', age: ''}.

Jednak, kiedy używam, spróbuj go opublikować, używając Angular's $http i otrzymując model od $scope, pojawia się jako undefined, gdy jest pusty.

+1

W kontrolerze, spróbuj dodać '$ scope.your_model_name_here =„”' –

+0

Próbowałem, ale to spowodowało całego modelu jest pusty ciąg znaków, a nawet nie pusty obiekt został utworzony. Jednak jawnie inicjowanie jednej właściwości w czasie, tak jak w odpowiedziach Shaunhusaina. – whirlwin

Odpowiedz

9

Możesz po prostu zdefiniować właściwości modelu w zakresie przed użyciem ich w widoku.

Po wyświetleniu kodu kontrolera pokażę, co trzeba zaktualizować, aby dodać je do zakresu.

Powinno to wyglądać mniej więcej tak:

W pliku js, który zdefiniowany aplikację

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

w HTML

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

Uwaga wolę nie posiadające globalne zmienne/funkcje więc używam innej składni podanej przez Angular, aby tego uniknąć i pozwolić na zminimalizowanie.

+0

To wydaje się być droga, jak na razie. – whirlwin

+0

Tak, oczywiście, pamiętajcie, nadal jestem trochę nokautem graniastym, ale używam go z dużym sukcesem w trzech projektach, jeden, nad którym obecnie pracuję, jest jak dotąd największy, ale cały te same pojęcia obowiązują niezależnie od skali. Dowiedz się, jak tworzyć kontrolery, usługi i dyrektywy, a możesz zrobić prawie wszystko. Poza tym jest już całkiem spora społeczność i mnóstwo świetnych komponentów (ng-grid, google-maps, żeby wymienić parę). Nigdy nie byłem facetem jQuery, który skoczyłem prosto z AS3/Flexa, więc jest całkiem znajomy i czysty. Snagy są dla mnie głównie związane z aktualizacjami zakresu. – shaunhusain

+0

Tak, zdecydowanie nie mogę się doczekać użycia Angular w przyszłych projektach, w przeciwieństwie do * tylko * jQuery. – whirlwin

1

Nie powinieneś używać serializacji jQuery.

Formularz powinien być związany z zakresem tak:

<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) 
    }; 
} 

Tak, że w $ http można po prostu przejść $ scope.formData.

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

+0

To właśnie robię obecnie. Jednak głównym problemem jest to, że pozostanie on pustym obiektem ('{}') i nie będzie dbał o niezdefiniowane wartości, gdy powiesz '$ scope.formData'. Potrzebuję czegoś, co zapewni uwzględnienie pustych wartości. – whirlwin

+1

Och, widzę. Cóż, w takim przypadku zdefiniuj obiekt w swoim zasięgu w następujący sposób: $ scope.formData = {'name': null, 'age': null}; – StuR

10

Możesz też spróbować:

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

czyli

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

przedstawi:

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

Dzięki za to. To było najlepsze rozwiązanie dla mojej małej aplikacji, w której budowa kontrolera nie jest konieczna (jeszcze). – drj

+0

Cieszę się, że mogę pomóc: D – Neaped

0

Czasami nie wiem, czy wartość jest ustawiona lub nie. Właśnie do tego służą wartości domyślne.

Używam tego, gdy chcę się upewnić, że zmienna ma jakąś wartość. Można go ustawić w kontrolerze

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

Działa świetnie bez kątowych oraz

// 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"; 

Jeśli trzeba ustawić kilka wartości, należy angular.extend lub jQuery.przedłużyć

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" } 

nadzieję, że pomoże

Powiązane problemy