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


80

जब मैं वॉच हैंडलिंग फ़ंक्शंस लिखता हूं तो मैं newVal param चेक करता हूं 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
आप कॉफ़ीस्क्रिप्ट पर जा सकते हैं। एक प्रश्नचिह्न postifix ऑपरेटर है जो ऐसा करता है।
पेट्रीक ज़ीमकोव्स्की

जब आपको ऐसी कार्यक्षमता की आवश्यकता होती है तो क्या आप वास्तविक मामला बता सकते हैं?
Stepan Suvorov

3
अपरिभाषित चेक और सिर्फ चेक खोना क्यों नहीं newVal == null?
डेविड शेरेट

3
क्योंकि (newVal === null) गलत हो जाता है अगर newVal अपरिभाषित है।
ग्रेग डफ़र्टी

हां, newVal === nullगलत होगा, लेकिन newVal == nullसच होगा। डेविड सही है।
पैट्रिक मैकेलेनै

जवाबों:


160

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

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

मुझे पता है कि js पुस्तकालयों का इस तरह विस्तार करना हमेशा अच्छा नहीं होता है, लेकिन यह मेरी खोज के बहुत करीब दिखता है। दरअसल, मुझे इसमें ज्यादा दिलचस्पी है कि मैं इसमें क्यों फंस गया। क्या वॉच हैंडलर में अपरिभाषित और अशक्त को संभालना एक मानक अभ्यास है?
slo2ols

अच्छी तरह से संरचित आवेदन में, IMHO, ऐसे मामले नहीं होने चाहिए।
Stepan Suvorov

मिल गया, thx लेकिन मुझे अभी भी लगता है कि 'अशक्त' सही चयन का परिणाम है और इसे 'अपरिभाषित' से अलग किया जाना चाहिए।
Stepan Suvorov

24
@STE- एक संरचित एप्लिकेशन में 'नल' खराब क्यों होगा? यदि, उदाहरण के लिए, एक चर केवल उपयोगकर्ता डेटा से भरा होना चाहिए जब उपयोगकर्ता लॉगिन होता है, तो लॉगिन से पहले और लॉगआउट के बाद नल उचित मूल्य है।
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;
});

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


4
मेरा दृढ़ता से मानना ​​है कि उपयोगिता फ़ंक्शंस DI
slo2ols

@ slo2ols इसे एनकैप्सुलेट करने के लिए आप एक सेवा बना सकते हैं और इसे केवल रोओ के लिए इंजेक्ट कर सकते हैं
लुकामा

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मिलान करने के लिए एक विधि चुन सकते हैं ।
फसमल

nullएक वस्तु है
spicykimchi

से isObjectरिटर्न: डॉक यह सच है, तो valueहै एक Objectनहीं बल्कि null
डेरेमिक

7

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

निम्नलिखित कोड 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?
जे। सेप्टेव

3

दर्ज करना अपरिभाषित या अशक्त होने की जाँच करने के लिए एक शॉर्टहैंड विधि प्रदान करता है: _.isNil(yourVariable)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.