Pregunta Indefinido o nulo para AngularJS


Cuando escribo funciones de manejo de reloj, compruebo el parámetro newVal undefined y null. ¿Por qué AngularJS tiene tal comportamiento, pero no tiene un método de utilidad particular? Entonces alli esta angular.isUndefined pero no angular.isUndefinedOrNull. No es difícil implementar eso a mano, pero ¿cómo ampliar 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 aceptada manejar tal manera?

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

73
2017-07-28 16:11


origen


Respuestas:


Siempre puede agregarlo exactamente para su aplicación

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

153
2017-07-28 19:15



Mi sugerencia para usted es escribir su propio servicio de utilidad. 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 podrías agregarlo al rootScope. Solo algunas opciones para ampliar angular con sus propias funciones de utilidad.


16
2017-07-28 17:07



Hace un tiempo hice la misma pregunta a los lodash maintaers y respondieron mencionando el != operador puede ser utilizado aquí:

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

Esto usa la coerción de tipo de JavaScript para verificar el valor de undefined o null.

Si está utilizando JSHint para cambiar 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
}

12
2017-07-25 11:58



¿Por qué no simplemente usar angular.isObject con negación? p.ej.

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

9
2018-06-17 15:27



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 nulo, indefinido, NaN e Infinity. Incorporar en NaN con nulo e indefinido es el beneficio real de la función para mí. Lumping Infinity in 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á el fuente para 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)));
  };
})

5
2017-11-24 20:49



lodash proporciona un método abreviado para verificar si es indefinido o nulo: _.isNil(yourVariable)


2
2017-08-23 19:56