[angularjs] AngularJS의 경우 정의되지 않거나 null

시계 처리 함수를 작성할 때 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);
    });
};



답변

항상 애플리케이션에 정확히 추가 할 수 있습니다.

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에도 추가 할 수 있습니다. 사용자 고유의 유틸리티 기능으로 각도를 확장하기위한 몇 가지 옵션입니다.


답변

나는 lodash 메인테이너들에게 똑같은 질문을 했고 그들은 !=여기 에서 연산자를 사용할 수 있다고 언급하면서 대답했다 .

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의 대답은 만족 스럽습니다. 그러나 약간 다른 접근 방식을 게시하는 것이 유용 할 것이라고 생각했습니다. null, undefined, NaN 및 Infinity를 제외한 모든 값에 대해 true를 반환하는 isValue라는 메서드를 사용합니다. null 및 undefined를 사용하여 NaN을 럼핑하는 것은 나에게 함수의 진정한 이점입니다. 무한대를 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)));
  };
})


답변

lodash 는 정의되지 않았는지 또는 null인지 확인하는 간단한 방법을 제공합니다.
_.isNil(yourVariable)


답변