Невизначений або нульовий для AngularJS


80

Коли я пишу функції обробки годинника, я перевіряю параметр newVal на undefinedта null. Чому AngularJS має таку поведінку, але не має конкретного методу корисності? Так що є, angular.isUndefinedале ні angular.isUndefinedOrNull. Це не складно виконати вручну, але як розширити кутовий, щоб мати цю функцію в кожному контролері? Tnx.

Редагувати :

Приклад:

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

1
Ви можете перейти на coffeescript. Існує оператор postifix із знаком запитання, який це робить.
Patryk Ziemkowski

не могли б ви дати реальний випадок, коли вам потрібна така функціональність?
Степан Суворов

3
Чому б не втратити невизначений чек і просто перевірити newVal == null?
Девід Шеррет,

3
Оскільки (newVal === null) повертає false, якщо newVal не визначено.
Грег Догерті

Так, newVal === nullбуде неправдою, але newVal == nullбуде правдою. Девід має рацію.
Патрік МакЕлхейні

Відповіді:


160

Ви завжди можете додати його саме для своєї програми

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

Я знаю, що не завжди добре розширювати js-бібліотеки таким чином, але це виглядає дуже близьким до мого пошуку. Власне, мене більше цікавить, чому я в цьому застряг. Це стандартна практика поводження з невизначеними та нульовими в обробниках годин?
slo2ols

Ну, ІМХО, у добре структурованому додатку таких випадків бути не повинно.
Степан Суворов

зрозумів, thx. Але я все ще вважаю, що "нуль" є результатом правильного вибору, і його слід відрізняти від "невизначеного".
Степан Суворов

24
@STEVER, чому "null" буде поганим у добре структурованому додатку? Якщо, наприклад, змінна повинна бути заповнена даними користувача лише тоді, коли користувач увійшов до системи, null - це належне значення до входу та після виходу з системи.
RonLugge

17

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

Приклад: 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. Лише кілька варіантів розширення кута за допомогою власних функцій утиліти.


4
Я твердо впевнений, що функції утиліти не повинні бути DI
slo2ols

@ slo2ols для його інкапсуляції ви можете створити послугу та вводити її лише для користувача
lucuma

14

Я задав те ж саме питання утримувачам лодашів деякий час назад, і вони відповіли, згадавши, що !=тут можна використовувати оператора:

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

Тут використовується примус типу JavaScript для перевірки значення для undefinedабо null.

Якщо ви використовуєте JSHint для накладання коду, додайте наступні блоки коментарів, щоб повідомити, що ви знаєте, що робите - більшу частину часу !=вважають поганим.

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

9

Чому б просто не використовувати angular.isObjectіз запереченням? напр

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

... але це чудовий варіант, якщо ви знаєте, якого типу це значення, і можете вибрати angular.isXметод, який відповідає.
Phasmal

nullє об’єктом
spicykimchi

З isObjectдокумента: Повертає: Істинно, якщо valueє, Objectале ні null.
DerMike

7

Відповідь @ STEVER задовільна. Однак я вважав, що може бути корисно опублікувати дещо інший підхід. Я використовую метод, який називається isValue, який повертає true для всіх значень, крім null, undefined, NaN та Infinity. Накопичення NaN із нулем та невизначеним - це справжня перевага функції для мене. Накладання Infinity на null і 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('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)));
  };
})

Чому б не замінити val === null || !angular.isDefined(val)просто val == null?
J.Steve

3

lodash надає скорочений метод для перевірки невизначеності чи нуля: _.isNil(yourVariable)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.