Cuando escribo funciones de manejo de relojes, verifico el parámetro newVal en undefined
y null
. ¿Por qué AngularJS tiene tal comportamiento, pero no tiene un método de utilidad particular? Entonces hay angular.isUndefined
pero no angular.isUndefinedOrNull
. No es difícil implementar eso a mano, pero ¿cómo extender el angular para tener esa función en cada controlador? Tnx.
Editar :
El ejemplo:
$scope.$watch("model", function(newVal) {
if (angular.isUndefined(newVal) || newVal == null) return;
// do somethings with newVal
}
¿Es una práctica común y aceptada manejar de esa manera?
Edición 2 :
El ejemplo de 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);
});
};
newVal == null
?newVal === null
será falso, peronewVal == null
será cierto. David tiene razón.Respuestas:
Siempre puede agregarlo exactamente para su aplicación
angular.isUndefinedOrNull = function(val) { return angular.isUndefined(val) || val === null }
fuente
Mi sugerencia es que escriba su propio servicio público. Puede incluir el servicio en cada controlador o crear un controlador principal, asignar el servicio de utilidad a su alcance y luego cada controlador secundario heredará esto sin que usted tenga que incluirlo.
Ejemplo: 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; });
O también puede agregarlo a rootScope. Solo algunas opciones para extender angular con sus propias funciones de utilidad.
fuente
Hice la misma pregunta a los mantenedores de lodash hace un tiempo y respondieron mencionando que el
!=
operador se puede usar aquí:if(newVal != null) { // newVal is defined }
Esto usa la coerción de tipo de JavaScript para verificar el valor de
undefined
onull
.Si está utilizando JSHint para filtrar su código, agregue los siguientes bloques de comentarios para decirle que sabe lo que está haciendo; la mayoría de las veces
!=
se considera malo./* jshint -W116 */ if(newVal != null) { /* jshint +W116 */ // newVal is defined }
fuente
¿Por qué no usarlo simplemente
angular.isObject
con negación? p.ejif (!angular.isObject(obj)) { return; }
fuente
angular.isX
método para hacer coincidir.null
es un objetoisObject
documento: Devuelve: True sivalue
es unObject
pero nonull
.La respuesta de @ STEVER es satisfactoria. Sin embargo, pensé que podría ser útil publicar un enfoque ligeramente diferente. Utilizo un método llamado isValue que devuelve verdadero para todos los valores excepto null, undefined, NaN e Infinity. Agrupar en NaN con nulo e indefinido es el beneficio real de la función para mí. Agrupar Infinity con nulo e indefinido es más discutible, pero francamente no es tan interesante para mi código porque prácticamente nunca uso Infinity.
El siguiente código está inspirado en Y.Lang.isValue . Aquí está la fuente de 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))); };
O como parte de una fábrica
.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))); }; })
fuente
val === null || !angular.isDefined(val)
con soloval == null
?lodash proporciona un método abreviado para verificar si no está definido o es nulo:
_.isNil(yourVariable)
fuente