AngularJS के लिए अपरिभाषित या शून्य




null undefined (4)

जब मैं घड़ी हैंडलिंग फ़ंक्शंस लिखता हूं तो मैं undefined और null पर newVal param की जांच करता हूं। AngularJS का ऐसा व्यवहार क्यों है, लेकिन इसमें विशेष उपयोगिता विधि नहीं है? तो angular.isUndefined है angular.isUndefined लेकिन angular.isUndefinedOrNull नहीं angular.isUndefinedOrNull । हाथ से इसे लागू करना मुश्किल नहीं है, लेकिन प्रत्येक नियंत्रक में उस कार्य को करने के लिए कोणीय कैसे विस्तारित किया जाता है? Tnx।

संपादित करें :

उदाहरण:

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

क्या इस तरह से संभालने के लिए यह आम स्वीकार्य अभ्यास है?

2 संपादित करें :

जेएसफ़ील्ड उदाहरण ( 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);
    });
};

@ स्टीवर का जवाब संतोषजनक है। हालांकि, मैंने सोचा कि थोड़ा अलग दृष्टिकोण पोस्ट करना उपयोगी हो सकता है। मैं isValue नामक एक विधि का उपयोग करता हूं जो शून्य, अपरिभाषित, NaN, और अनंतता को छोड़कर सभी मानों के लिए सत्य देता है। नाल और अपरिभाषित के साथ NaN में लंपिंग मेरे लिए समारोह का वास्तविक लाभ है। नल और अपरिभाषित के साथ अनंतता लंपिंग अधिक बहस योग्य है, लेकिन स्पष्ट रूप से मेरे कोड के लिए दिलचस्प नहीं है क्योंकि मैं व्यावहारिक रूप से कभी भी अनंतता का उपयोग नहीं करता हूं।

निम्नलिखित कोड Y.Lang.isValue द्वारा प्रेरित है। Y.Lang.isValue के लिए source यहां है।

/**
 * 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)));
  };
})

आप इसे हमेशा अपने आवेदन के लिए जोड़ सकते हैं

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

या आप इसे रूटस्कोप में भी जोड़ सकते हैं। अपने स्वयं के उपयोगिता कार्यों के साथ कोणीय विस्तार करने के लिए बस कुछ विकल्प।


मैंने थोड़ी देर पहले लॉनाश रखरखाव के एक ही सवाल से पूछा और उन्होंने इसका उल्लेख करके जवाब दिया != ऑपरेटर का यहां उपयोग किया जा सकता है:

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

यह undefined या null के मान को जांचने के लिए जावास्क्रिप्ट के प्रकार जबरन का उपयोग करता है।

यदि आप अपने कोड को लिंट करने के लिए JSHint का उपयोग कर रहे हैं, तो यह बताने के लिए निम्न टिप्पणी ब्लॉक जोड़ें कि आप जानते हैं कि आप क्या कर रहे हैं - अधिकांश समय != बुरा माना जाता है।

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




undefined