2013-07-28 15 views
69

Kiedy piszę funkcje obsługi zegarków, sprawdzam parametr newVal na undefined i null. Dlaczego AngularJS ma takie zachowanie, ale nie ma szczególnej metody użyteczności? Tak więc istnieje angular.isUndefined, ale nie angular.isUndefinedOrNull. Nie jest trudno to wdrożyć ręcznie, ale jak rozszerzyć kątowo, aby mieć tę funkcję w każdym kontrolerze? Tnx.Nieokreślona lub null dla AngularJS

Edit:

Przykład:

$scope.$watch("model", function(newVal) { 
    if (angular.isUndefined(newVal) || newVal == null) return; 
    // do somethings with newVal 
} 

Czy to powszechną praktyką akceptowaną obsłużyć taki sposób?

Edycja 2:

Przykład JSFiddle (http://jsfiddle.net/ubA9r/):

<div ng-app="App"> 
    <div ng-controller="MainCtrl"> 
     <select ng-model="model" ng-options="m for m in models"> 
      <option value="" class="ng-binding">Choose model</option> 
     </select> 
     {{model}} 
    </div> 
</div> 

var app = angular.module("App", []); 

var MainCtrl = function($scope) { 
    $scope.models = ['Apple', 'Banana']; 
    $scope.$watch("model", function(newVal) { 
     console.log(newVal); 
    }); 
}; 
+1

Można przełączyć się coffeescript. Występuje znakowy operator postifix, który to robi. –

+0

czy mógłbyś podać prawdziwy przypadek, gdy potrzebujesz takiej funkcjonalności? –

+2

Dlaczego nie [stracić niezdefiniowanej kontroli] (http://stackoverflow.com/a/15992131/188246) i po prostu sprawdzić 'newVal == null'? –

Odpowiedz

149

Zawsze możesz dodać go dokładnie do aplikacji

angular.isUndefinedOrNull = function(val) { 
    return angular.isUndefined(val) || val === null 
} 
+0

Wiem, że nie zawsze dobrze jest rozszerzać biblioteki js w taki sposób, ale wygląda to bardzo blisko moich poszukiwań. Właściwie jestem bardziej zainteresowany tym, dlaczego się w to wkurzyłem. Czy standardową praktyką jest obsługa niezdefiniowanych i zerowych funkcji obsługi zegarków? – slo2ols

+0

Cóż, IMHO, w dobrze zorganizowanej aplikacji nie powinno być takich przypadków. –

+0

rozumiem, thx. Ale nadal uważam, że "null" jest wynikiem prawidłowej selekcji i należy go odróżnić od "niezdefiniowanego". –

16

Moja propozycja dla ciebie jest, aby napisać swój własny serwis użytkową. Możesz włączyć usługę do każdego kontrolera lub utworzyć kontroler nadrzędny, przypisać usługę użyteczności do swojego zakresu, a następnie każdy kontroler podrzędny odziedziczy to bez konieczności dołączania go.

Przykład: http://plnkr.co/edit/NI7V9cLkQmEtWO36CPXy?p=preview

var app = angular.module('plunker', []); 

app.controller('MainCtrl', function($scope, Utils) { 
    $scope.utils = Utils; 
}); 

app.controller('ChildCtrl', function($scope, Utils) { 
    $scope.undefined1 = Utils.isUndefinedOrNull(1); // standard DI 
    $scope.undefined2 = $scope.utils.isUndefinedOrNull(1); // MainCtrl is parent 

}); 

app.factory('Utils', function() { 
    var service = { 
    isUndefinedOrNull: function(obj) { 
     return !angular.isDefined(obj) || obj===null; 
    } 

    } 

    return service; 
}); 

Albo można go dodać do rootScope również. Kilka opcji rozszerzania kątowego o własne funkcje użytkowe.

+4

Mocno wierzę, że funkcje narzędziowe nie powinny być DI – slo2ols

+0

@ slo2ols do enkapsulacji, możesz utworzyć usługę i wstrzyknąć ją tylko do roo – lucuma

10

Dlaczego nie wystarczy użyć angular.isObject z negacji? na przykład

if (!angular.isObject(obj)) { 
    return; 
} 
+0

Nie działa w przypadku typów pierwotnych. –

+0

... ale jest świetną opcją, jeśli wiesz, jaki typ ma wartość i może wybrać metodę "angular.isX". – Phasmal

+0

'null' to obiekt – kedomonzter

11

I asked the same question of the lodash maintainers a while back a one odpowiedziały wspomnieć operatora != można stosować tutaj:

if(newVal != null) { 
    // newVal is defined 
} 

ta wykorzystuje JavaScript typ przymus, aby sprawdzić wartość dla undefined lub null.

Jeśli używasz JSHint do zawiązania kodu, dodaj następujące bloki komentarzy, aby poinformować, że wiesz, co robisz - przez większość czasu != jest uważany za zły.

/* jshint -W116 */ 
if(newVal != null) { 
/* jshint +W116 */ 
    // newVal is defined 
} 
5

@ Stever odpowiedź jest zadowalająca. Pomyślałem jednak, że może być przydatne umieszczenie nieco innego podejścia. Używam metody o nazwie isValue, która zwraca wartość true dla wszystkich wartości z wyjątkiem wartości null, undefined, NaN i Infinity. Wstawianie NaN z wartością zerową i niezdefiniowaną jest dla mnie prawdziwą korzyścią dla mnie. Lumping Infinity in z wartością null i undefined jest bardziej dyskusyjne, ale szczerze mówiąc nie jest to interesujące dla mojego kodu, ponieważ praktycznie nigdy nie używam Infinity.

Poniższy kod jest zainspirowany przez Y.Lang.isValue. Oto source dla Y.Lang.isValue.

/** 
* A convenience method for detecting a legitimate non-null value. 
* Returns false for null/undefined/NaN/Infinity, true for other values, 
* including 0/false/'' 
* @method isValue 
* @static 
* @param o The item to test. 
* @return {boolean} true if it is not null/undefined/NaN || false. 
*/ 
angular.isValue = function(val) { 
    return !(val === null || !angular.isDefined(val) || (angular.isNumber(val) && !isFinite(val))); 
}; 

lub jako część fabryki

.factory('lang', function() { 
    return { 
    /** 
    * A convenience method for detecting a legitimate non-null value. 
    * Returns false for null/undefined/NaN/Infinity, true for other values, 
    * including 0/false/'' 
    * @method isValue 
    * @static 
    * @param o The item to test. 
    * @return {boolean} true if it is not null/undefined/NaN || false. 
    */ 
    isValue: function(val) { 
     return !(val === null || !angular.isDefined(val) || (angular.isNumber(val) && !isFinite(val))); 
    }; 
}) 
+0

Dlaczego nie zastąpić 'val === null || ! angular.isDefined (val) 'z tylko' val == null'? –

2

lodash zapewnia sposób skrótowy, aby sprawdzić, czy niezdefiniowany lub zerowy: _.isNil(yourVariable)

Powiązane problemy