Undefined or null for AngularJS

Kiedy piszę funkcje obsługi zegarka sprawdzam newVal param na undefined i null. Dlaczego AngularJS ma takie zachowanie, ale nie ma konkretnej metody użytkowej? Więc jest angular.isUndefined, ale nie angular.isUndefinedOrNull. Nie jest trudno zaimplementować to ręcznie, ale jak rozszerzyć angular, aby mieć tę funkcję w każdym kontrolerze? Tnx.

Edit :

Przykład:

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

Czy jest to powszechnie akceptowana praktyka, aby radzić sobie w ten sposób?

Edytuj 2:

JSFiddle przykład ( 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);
    });
};
Author: Kick Buttowski, 2013-07-28

6 answers

Zawsze możesz dodać go dokładnie do swojej aplikacji

angular.isUndefinedOrNull = function(val) {
    return angular.isUndefined(val) || val === null 
}
 153
Author: Stepan Suvorov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-20 20:12:49

Moja propozycja dla ciebie to napisanie własnego serwisu użytkowego. Możesz włączyć usługę do każdego kontrolera lub utworzyć kontroler nadrzędny, przypisać usługę narzędzia do swojego zakresu, a następnie każdy kontroler potomny odziedziczy ją bez konieczności dołączania go.

Przykład: 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;
});
Możesz też dodać go do rootScope. Tylko kilka opcji rozszerzenia kątowego za pomocą własnych funkcji użytkowych.
 16
Author: lucuma,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-21 21:54:36

Zadałem to samo pytanie opiekunom lodash jakiś czas temu i odpowiedzieli, wspominając o operatorze !=, który może być użyty tutaj:

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

To używa JavaScript ' S Type coercion, aby sprawdzić wartość dla undefined lub null.

Jeśli używasz JSHint do lintowania kodu, dodaj następujące bloki komentarzy, aby powiedzieć, że wiesz, co robisz-większość czasu != jest uważana za złą.

/* jshint -W116 */ 
if(newVal != null) {
/* jshint +W116 */
  // newVal is defined
}
 12
Author: Tom Spencer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-25 11:58:00

Dlaczego po prostu nie użyć angular.isObject z negacją? np.

if (!angular.isObject(obj)) {
    return;
}
 9
Author: Pete,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-17 15:27:37

@ STEVER odpowiedź jest zadowalająca. Jednak pomyślałem, że może być przydatne, aby opublikować nieco inne podejście. Używam metody o nazwie isValue, która zwraca true dla wszystkich wartości oprócz null, undefined, NaN i Infinity. Dodawanie NaN przez null i undefined jest dla mnie prawdziwą korzyścią z tej funkcji. Wrzucanie nieskończoności z null i undefined jest bardziej dyskusyjne, ale szczerze mówiąc nie jest to interesujące dla mojego kodu, ponieważ praktycznie nigdy nie używam nieskończoności.

Następujący kod to zainspirowany Y. Lang.isValue . Oto źródło dla 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)));
};

Lub jako część fabryki

.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
Author: Steven Wexler,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-24 21:19:18

Lodash dostarcza skróconą metodę sprawdzania, czy undefined czy null: _.isNil(yourVariable)

 2
Author: nigong,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-23 19:56:39