2013-07-28 15 views
69

Wenn ich Funktionen für die Uhrverarbeitung schreibe, überprüfe ich NewVal param auf undefined und null. Warum hat AngularJS ein solches Verhalten, hat aber keine spezielle Nutzungsmethode? So gibt es angular.isUndefined aber nicht angular.isUndefinedOrNull. Es ist nicht schwer, das per Hand zu implementieren, aber wie kann man Winkel erweitern, um diese Funktion in jedem Controller zu haben? Tnx.Nicht definiert oder null für AngularJS

bearbeiten:

Das Beispiel:

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

Ist es üblich akzeptierte Praxis, eine solche Art und Weise zu handhaben?

Edit 2:

Das JSFiddle Beispiel (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

Sie wechseln Coffee könnte. Es gibt einen Fragezeichen-Posifix-Operator, der das tut. –

+0

Könnten Sie bitte den echten Fall angeben, wenn Sie solche Funktionen benötigen? –

+2

Warum nicht [die nicht definierte Überprüfung verlieren] (http://StackOverflow.com/a/15992131/188246) und einfach "newVal == null" überprüfen? –

Antwort

149

Sie können es immer hinzufügen, genau für Ihre Anwendung

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

Ich weiß, dass nicht immer gut ist, um js Bibliotheken so zu erweitern, aber es sieht sehr aus nah an meiner Suche. Eigentlich interessiere ich mich mehr dafür, warum ich dabei geblieben bin. Ist es eine Standardpraxis, nicht definierte und null in Uhrhandlern zu behandeln? – slo2ols

+0

Nun, IMHO, in einer gut strukturierten Anwendung sollte es solche Fälle nicht geben. –

+0

habe es, thx. Aber ich denke immer noch, dass 'null' das Ergebnis einer korrekten Auswahl ist und von 'undefiniert' unterschieden werden sollte. –

16

Sie Mein Vorschlag ist, Ihren eigenen Utility Service zu schreiben. Sie können den Dienst in jeden Controller aufnehmen oder einen übergeordneten Controller erstellen, den Dienstprogrammdienst Ihrem Bereich zuweisen, und dann erbt jeder untergeordnete Controller dies, ohne dass Sie ihn hinzufügen müssen.

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

Oder man könnte es auch an den rootScope hinzuzufügen. Nur ein paar Optionen, um eckig mit eigenen Utility-Funktionen zu erweitern.

+4

Ich glaube fest, dass Utility-Funktionen sollten nicht DI – slo2ols

+0

@ slo2ols zu kapseln, Sie könnten einen Dienst erstellen und injizieren es nur auf die roo – lucuma

10

Warum nicht einfach mit Negation verwenden angular.isObject? z.B.

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

Diese nutzt JavaScript des Art Zwang, den Wert für undefined oder null zu überprüfen:

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

Es funktioniert nicht für primitive Typen. –

+0

... ist aber eine großartige Option, wenn Sie wissen, welcher Typ der Wert ist, und Sie können eine passende 'angular.isX'-Methode wählen. – Phasmal

+0

'null' ist ein Objekt – kedomonzter

11

I asked the same question of the lodash maintainers a while back und sie antworteten mit den != Betreiber zu erwähnen kann hier verwendet werden.

Wenn Sie Ihren Code mit JSHint fusseln, fügen Sie die folgenden Kommentarblöcke hinzu, um zu sagen, dass Sie wissen, was Sie tun - die meiste Zeit wird != als schlecht angesehen.

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

@ Antwort Stever ist zufriedenstellend. Ich hielt es jedoch für sinnvoll, einen etwas anderen Ansatz zu veröffentlichen. Ich benutze eine Methode namens isValue, die für alle Werte mit Ausnahme von null, undefined, NaN und Infinity true zurückgibt. NaN mit Null und undefiniert zu vermengen ist der eigentliche Vorteil der Funktion für mich. Infinity mit null und undefined zu infizieren ist umstrittener, aber ehrlich gesagt nicht so interessant für meinen Code, weil ich Infinity praktisch nie benutze.

Der folgende Code wurde von Y.Lang.isValue inspiriert. Hier ist die source für 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))); 
}; 

oder als Teil einer Fabrik

.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

Warum nicht ersetzen? Val === null || ! angular.isDefined (val) 'mit nur' val == null'? –

2

lodash ein verkürztes Verfahren liefert, wenn nicht definiert oder null zu überprüfen: _.isNil(yourVariable)

Verwandte Themen