javascript सामान्य तरीके से 'संभावित रूप से अनियंत्रित अस्वीकृति: बैकड्रॉप क्लिक' को कैसे नियंत्रित करें




angularjs error-handling (4)

मेरे पास मॉडल से निपटने के लिए एक कोणीय सेवा है:

angular.module('myApp').service('ModalService', function($uibModal) {
  function open(options) {
    return $uibModal.open(options);
  }
});

अब मैं कोणीय 1.6 पर अपग्रेड कर दिया और यह त्रुटि मिली:

शायद अनजाने अस्वीकृति: पृष्ठभूमि क्लिक करें

जब भी मैं एक मोडल खोलता हूं और कहीं और क्लिक करता हूं (पृष्ठभूमि) और मोडल बंद होता है (जैसा कि इरादा है)। इसलिए मैं अपने ModalService में इस ModalService unhandled exception को संभालना चाहता ModalService क्योंकि मैं हर बार जब मैं ModalService उपयोग करता हूं तो इस मामले को संभाल नहीं करना चाहता। पृष्ठभूमि पर क्लिक करके मॉडल को बंद करना हमेशा ठीक है, यह कोई अपवाद नहीं है।

मैंने कोशिश की:

angular.module('myApp').service('ModalService', function($uibModal) {
  function open(options) {
    var modalInstance = $uibModal.open(options);
    modalInstance.result.catch(function error(error) {
      if(error === "backdrop click") {
        // do nothing
      } else {
        throw error;
      }
    })
    return modalInstance;
  }
});

लेकिन यह समस्या की ओर जाता है कि मैं backdrop click तुलना में अन्य त्रुटियों को संभाल नहीं सकता क्योंकि वे हमेशा फेंका जाते हैं:

ModalService.open({...}).result.catch(function(error) {
  // this will catch the error too, but the throw in the ModalService
  // will occure in parallel and will not be catched by this function
});

और अगर मैं इसे इस तरह की कोशिश करता हूं:

angular.module('myApp').service('ModalService', function($uibModal) {
  function open(options) {
    var modalInstance = $uibModal.open(options);
    modalInstance.result.then(function(whatever) {
      return whatever;
    }, function rejection(error) {
      return error;
    });
    return modalInstance;
  });
});

यह 'खारिज अस्वीकृति अस्वीकृति' त्रुटि को हल करता है, लेकिन प्रत्येक मामले के लिए न केवल 'पृष्ठभूमि क्लिक' के लिए

क्या इस मामले के लिए कोई अच्छा समाधान है?


यदि आप अपने मोडल के अंदर एक नियंत्रक का उपयोग कर रहे हैं मैं इसे बंद करने की घटना पर इस्तेमाल किया क्योंकि 'समापन' मान्य है लेकिन 'अस्वीकरण' अस्वीकृति है यह आपके मोडल नियंत्रक के भीतर चला जाता है, माता-पिता नहीं।

            $scope.$on('modal.closing', (event, reason, closed) => {
                if (!closed) {
                    event.preventDefault();
                    $scope.$close("Closing");   
                }

            });

इसलिए आपका पृष्ठभूमि क्लिक बंद करने की घटना को बंद कर देगा, लेकिन बंद झूठे पास हो जाएगा। यदि ऐसा मामला है, तो डिफ़ॉल्ट व्यवहार को रोकें, और कार्यक्रम को ख़ारिज करने के बजाय मोडल को बंद करें। ध्यान रखें कि यदि आप इसे अपने मूल उद्देश्य के लिए उपयोग करना चाहते हैं, तो यह खारिज करने का उपयोग टूट जाएगा।


यूआई विशिष्टता निर्भर

यह सबसे बड़ा समाधान नहीं है यदि यूआई विनिर्देश हैं जो अंत उपयोगकर्ता को मोडल को बंद करने के लिए मोडल को बाहर करने में सक्षम होना चाहिए।

अगर यह मामला नहीं है और मॉडल के शीर्ष दाईं ओर थोड़ी 'एक्स' है और / या निकट है

बैकड्रॉप: गलत, // <<< !!!!!!! (नीचे कोड देखें)
मोडल को बंद करने के लिए मोडल को बाहर करने के लिए अंत-उपयोगकर्ता को रोक देगा।

$scope.change = function (changeableData, p_Mode) {
    var modalInstance = $uibModal.open({
        templateUrl: whatever,
        controller: ModalInstanceCtrl,
        scope: $scope,
        backdrop: false,  // <<< !!!!!!!
        resolve: {
            // whatever
        }
    });  

इससे "संभवत: अनियंत्रित अस्वीकृति: बैकड्रॉप क्लिक" त्रुटि को होने से रोका जा सकेगा।

एक बार फिर, आपको UI विनिर्देशों को देखने और / या विश्लेषकों की अनुमति प्राप्त करने की आवश्यकता है।


दुर्भाग्यवश वे आधिकारिक प्लकर फॉर मोडल (ui.bootstrap.modal) में इसे कैसे संभालते हैं।

यदि आप किसी भी बटन पर क्लिक करते हैं तो इससे कुछ ऐसा लॉग होता है:

मोडल को खारिज किया गया: गुरु Feb 23 2017 21:54:26 GMT-0300 (प्रशांत एसए डेलाइट टाइम)

वे क्या करते हैं:

modalInstance.result.then(function (selectedItem) {
  $ctrl.selected = selectedItem;
}, function () {
  $log.info('Modal dismissed at: ' + new Date());
});

यदि आप त्रुटि कॉलबैक हटाते हैं, तो अनुमान लगाएं कि आपको क्या मिलता है:

शायद अनजाने अस्वीकृति: पृष्ठभूमि क्लिक करें

और रद्द करने पर भी

शायद अनजान अस्वीकृति: रद्द करें

अब तक, आप या तो ऐसा करते हैं या इस समाधान का उपयोग न किए गए अस्वीकृतिओं को चुप्पी करने के लिए करते हैं

app.config(['$qProvider', function ($qProvider) {
            $qProvider.errorOnUnhandledRejections(false);
        }]);

इसे इस्तेमाल करो

 $uibModal.open({
                    ////your code......
}).result.then(function(){}, function(res){})

अब यह आपको त्रुटि नहीं देगा







angular-ui