Undefined или null для AngularJS



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



Edit:



пример:



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


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



Edit 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);
});
};
634   6  

6 ответов:

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

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

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

Пример: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, а также. Всего несколько вариантов расширения углового с вашим собственным функция полезности.

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

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

это использует тип принуждения JavaScript, чтобы проверить значение для undefined или null.

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

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

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

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

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

следующий код вдохновлен 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('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)));
  };
})

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

Comments

    Ничего не найдено.