Wenn ich Uhrhandhabungsfunktionen schreibe, überprüfe ich newVal param on undefined
und null
. Warum hat AngularJS ein solches Verhalten, aber keine spezielle Dienstprogrammmethode? Also gibt es angular.isUndefined
doch nicht angular.isUndefinedOrNull
. Es ist nicht schwer, dies von Hand zu implementieren, aber wie weit ist der Winkel, um diese Funktion in jedem Controller zu haben? Tnx.
Bearbeiten :
Das Beispiel:
$scope.$watch("model", function(newVal) {
if (angular.isUndefined(newVal) || newVal == null) return;
// do somethings with newVal
}
Ist es allgemein anerkannt, so umzugehen?
Bearbeiten 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);
});
};
newVal == null
?newVal === null
wird falsch sein, abernewVal == null
wird wahr sein. David ist richtig.Antworten:
Sie können es jederzeit genau für Ihre Anwendung hinzufügen
angular.isUndefinedOrNull = function(val) { return angular.isUndefined(val) || val === null }
quelle
Mein Vorschlag an Sie ist, Ihren eigenen Dienstprogrammdienst 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 diesen, ohne dass Sie ihn einschließen 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 Sie können es auch dem rootScope hinzufügen. Nur ein paar Optionen zum Erweitern des Winkels mit Ihren eigenen Dienstprogrammfunktionen.
quelle
Ich habe vor einiger Zeit die gleiche Frage an die Lodash-Betreuer gestellt, und sie antworteten mit der Erwähnung, dass der
!=
Betreiber hier verwendet werden kann:if(newVal != null) { // newVal is defined }
Hierbei wird der Typzwang von JavaScript verwendet, um den Wert für zu überprüfen
undefined
odernull
.Wenn Sie JSHint verwenden, um Ihren Code zu fusseln, fügen Sie die folgenden Kommentarblöcke hinzu, um anzuzeigen, dass Sie wissen, was Sie tun - die meiste Zeit
!=
wird als schlecht angesehen./* jshint -W116 */ if(newVal != null) { /* jshint +W116 */ // newVal is defined }
quelle
Warum nicht einfach
angular.isObject
mit Negation verwenden? z.Bif (!angular.isObject(obj)) { return; }
quelle
angular.isX
passende Methode auswählen können .null
ist ein ObjektisObject
Dokument: Rückgabe: True ifvalue
ist einObject
aber nichtnull
.Die Antwort von @ STEVER ist zufriedenstellend. Ich hielt es jedoch für nützlich, einen etwas anderen Ansatz zu veröffentlichen. Ich verwende eine Methode namens isValue, die für alle Werte außer null, undefined, NaN und Infinity true zurückgibt. Das Zusammenfassen von NaN mit null und undefiniert ist für mich der eigentliche Vorteil der Funktion. Infinity mit null und undefined zusammenzufassen ist umstrittener, aber ehrlich gesagt nicht so interessant für meinen Code, da ich Infinity praktisch nie benutze.
Der folgende Code ist von Y.Lang.isValue inspiriert . Hier ist die Quelle 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))); }; })
quelle
val === null || !angular.isDefined(val)
nur ersetzenval == null
?lodash bietet eine Kurzmethode , um zu überprüfen, ob undefiniert oder null:
_.isNil(yourVariable)
quelle