Подтвердить что ты не робот

Undefined или null для AngularJS

Когда я пишу функции обработки часов, я проверяю параметр newVal на undefined и null. Почему у AngularJS такое поведение, но нет специального метода утилиты? Таким образом, существует angular.isUndefined, но не angular.isUndefinedOrNull. Нетрудно реализовать это вручную, но как расширить angular, чтобы иметь эту функцию в каждом контроллере? Tnx.

Edit

Пример:

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

Общепринятой практикой является такая практика?

Изменить 2:

Пример 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);
    });
};
4b9b3361

Ответ 1

Вы всегда можете добавить его именно для своего приложения

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

Ответ 2

Мое предложение - написать свою собственную сервисную службу. Вы можете включить службу в каждый контроллер или создать родительский контроллер, назначить служебную службу для своей области, а затем каждый дочерний контроллер наследует ее, не добавляя ее.

Пример: 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;
});

Или вы можете добавить его и в rootScope. Всего несколько вариантов расширения angular с помощью собственных функций утилиты.

Ответ 3

Я задал тот же вопрос о сопровождающих lodash некоторое время назад, и они ответили, указав, что оператор != может быть использован здесь:

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

Это использует принуждение типа JavaScript для проверки значения для undefined или null.

Если вы используете JSHint, чтобы добавить код, добавьте следующие блоки комментариев, чтобы сообщить ему, что вы знаете, что вы делаете, - большую часть времени != считается плохим.

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

Ответ 4

Почему бы просто не использовать angular.isObject с отрицанием? например.

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

Ответ 5

@STEVER ответ удовлетворительный. Тем не менее, я думал, что может быть полезно опубликовать несколько иной подход. Я использую метод с именем isValue, который возвращает true для всех значений, кроме null, undefined, NaN и Infinity. Насыщение в NaN нулевым значением и undefined является реальным преимуществом функции для меня. Lumping Infinity с нулевым и undefined более спорным, но, откровенно говоря, это не очень интересно для моего кода, потому что я практически никогда не использую Infinity.

Следующий код вдохновлен Y.Lang.isValue. Вот источник для 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)));
};

Или как часть factory

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

Ответ 6

lodash предоставляет сокращенный метод проверки, если undefined или null: _.isNil(yourVariable)