एनजी-क्लिक पर पुष्टि संवाद - AngularJS


85

मैं ng-clickएक कस्टम angularjs निर्देश का उपयोग करके एक पुष्टिकरण संवाद स्थापित करने की कोशिश कर रहा हूं :

app.directive('ngConfirmClick', [
    function(){
        return {
            priority: 1,
            terminal: true,
            link: function (scope, element, attr) {
                var msg = attr.ngConfirmClick || "Are you sure?";
                var clickAction = attr.ngClick;
                element.bind('click',function (event) {
                    if ( window.confirm(msg) ) {
                        scope.$eval(clickAction)
                    }
                });
            }
        };
}])

यह महान काम करता है लेकिन दुर्भाग्य से, मेरे निर्देश का उपयोग करते हुए टैग के अंदर के भावों का मूल्यांकन नहीं किया जाता है:

<button ng-click="sayHi()" ng-confirm-click="Would you like to say hi?">Say hi to {{ name }}</button>

(नाम का मूल्यांकन नहीं किया गया है यह मामला है)। यह मेरे निर्देशन के टर्मिनल पैरामीटर के कारण लगता है। क्या आपके पास वर्कअराउंड का कोई विचार है?

मेरे कोड का परीक्षण करने के लिए: http://plnkr.co/edit/EHmRpfwsgSfEFVMgRLgj?p=preview


आप इस मामले में टर्मिनल का उपयोग क्यों करते हैं? ऐसा लगता है कि यह पूरी तरह से बिना काम करता है (और आप इसे जानते हैं)। मुझे आश्चर्य है कि आपको क्यों लगता है कि यह आपके निर्देश में आवश्यक है।
साइमन बेलेंगर

@SimonBelanger टर्मिनल के साथ = गलत, भले ही मैं पुष्टि डायलॉग में "रद्द करें" पर क्लिक करूं, कहेगी () ट्रिगर है। यदि उपयोगकर्ता रद्द पर क्लिक करता है तो मेरा लक्ष्य SayHi () को कॉल करना नहीं है।
पोइय्युट्रिज़

जवाबों:


92

यदि आप उपयोग नहीं करने का मन नहीं है ng-click, यह ठीक काम करता है। आप बस इसे किसी और चीज़ में बदल सकते हैं और फिर भी विशेषता पढ़ सकते हैं, जबकि क्लिक हैंडलर से बचने के लिए दो बार समस्या उत्पन्न हो रही है।

http://plnkr.co/edit/YWr6o2?p=preview

मुझे लगता है कि समस्या terminalअन्य निर्देशों को नहीं चलाने का निर्देश है। डेटा-बाइंडिंग निर्देश के {{ }}लिए केवल एक अन्य नाम है ng-bind, जिसे संभवतः रद्द कर दिया गया है terminal


13
यह कोड स्निपेट अब कोणीय के वर्तमान संस्करण के साथ काम नहीं करता है। स्कोप। $ eval (..) को स्कोप से बदला जाना चाहिए। $ apply (..)
CoolTapes

कृपया
E2E-

यह काम करता है, लेकिन अगर मैं क्रोम का चेकबॉक्स "अतिरिक्त संवाद बनाने के लिए इस पृष्ठ से बचें" चेक करता हूं तो क्या होगा? : s
bigpony

58

एक साफ निर्देश दृष्टिकोण।

अपडेट: पुराना उत्तर (2014)

यह मूल रूप से ng-clickघटना को स्वीकार करता है, ng-confirm-click="message"निर्देश में निहित संदेश प्रदर्शित करता है और उपयोगकर्ता को पुष्टि करने के लिए कहता है। यदि पुष्टिकरण को सामान्य ng-clickनिष्पादन पर क्लिक किया जाता है , यदि स्क्रिप्ट समाप्त ng-clickनहीं होती है और नहीं चलती है।

<!-- index.html -->
<button ng-click="publish()" ng-confirm-click="You are about to overwrite your PUBLISHED content!! Are you SURE you want to publish?">
  Publish
</button>
// /app/directives/ng-confirm-click.js
Directives.directive('ngConfirmClick', [
  function(){
    return {
      priority: -1,
      restrict: 'A',
      link: function(scope, element, attrs){
        element.bind('click', function(e){
          var message = attrs.ngConfirmClick;
          // confirm() requires jQuery
          if(message && !confirm(message)){
            e.stopImmediatePropagation();
            e.preventDefault();
          }
        });
      }
    }
  }
]);

ज़च स्नो को कोड क्रेडिट: http://zachsnow.com/#/blog/2013/confirming-ng-click/

अपडेट: नया उत्तर (2016)

1) पूर्व ('एनजी') के रूप में 'एनजी' से 'एमडब्ल्यू' तक परिवर्तित उपसर्ग देशी कोणीय निर्देशों के लिए आरक्षित है।

2) एनजी-क्लिक इवेंट को इंटरसेप्ट करने के बजाय एक फ़ंक्शन और संदेश पारित करने के लिए संशोधित निर्देश।

3) डिफ़ॉल्ट रूप से जोड़ा गया "क्या आपको यकीन है?" इस मामले में संदेश कि mw- पुष्टि-क्लिक-संदेश = "" के लिए एक कस्टम संदेश प्रदान नहीं किया गया है।

<!-- index.html -->
<button mw-confirm-click="publish()" mw-confirm-click-message="You are about to overwrite your PUBLISHED content!! Are you SURE you want to publish?">
  Publish
</button>
// /app/directives/mw-confirm-click.js
"use strict";

var module = angular.module( "myApp" );
module.directive( "mwConfirmClick", [
  function( ) {
    return {
      priority: -1,
      restrict: 'A',
      scope: { confirmFunction: "&mwConfirmClick" },
      link: function( scope, element, attrs ){
        element.bind( 'click', function( e ){
          // message defaults to "Are you sure?"
          var message = attrs.mwConfirmClickMessage ? attrs.mwConfirmClickMessage : "Are you sure?";
          // confirm() requires jQuery
          if( confirm( message ) ) {
            scope.confirmFunction();
          }
        });
      }
    }
  }
]);

8
नायब,
eggonlegs

1
यह मेरे लिए काम नहीं कर रहा है। कोई पुष्टि नहीं दिखाता है और क्लिक जारी है। कोई और?
OneHoopyFrood

मुझे लगता है कि एनजी-क्लिक क्लिक हैंडलर को अनबाइंड नहीं करना एक बुरा विचार है और फिर तत्काल बंद करने और डिफ़ॉल्ट को रोकने पर भरोसा करें
जेम्स क्लेह

OneHoopyFrood, आपके पास एनजी-क्लिक = "" में एक मान्य फ़ंक्शन होना चाहिए या यह विफल रहता है। धन्यवाद।
माइकबागघ

क्यों चरण 2) एनजी-क्लिक इवेंट को इंटरसेप्ट करने के बजाय एक फ़ंक्शन और संदेश पारित करने के लिए संशोधित निर्देश?
चांदी

46

मेरे लिए, https://www.w3schools.com/js/js_popup.asp , ब्राउज़र के डिफ़ॉल्ट पुष्टिकरण संवाद बॉक्स ने बहुत काम किया। बस इस की कोशिश की:

$scope.delete = function() {
    if (confirm("sure to delete")) {
        // todo code for deletion
    }
};

सरल .. :)
लेकिन मुझे लगता है कि आप इसे अनुकूलित नहीं कर सकते। यह "रद्द करें" या "ओके" बटन के साथ दिखाई देगा।

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

यदि आप आयनिक ढांचे का उपयोग कर रहे हैं, तो आपको निम्नानुसार आयनिकपॉप डायलॉग का उपयोग करना होगा:

// A confirm dialog


$scope.showConfirm = function() {
   var confirmPopup = $ionicPopup.confirm({
     title: 'Delete',
     template: 'Are you sure you want to delete this item?'
   });

   confirmPopup.then(function(res) {
     if(res) {
       // Code to be executed on pressing ok or positive response
       // Something like remove item from list
     } else {
       // Code to be executed on pressing cancel or negative response
     }
   });
 };

अधिक जानकारी के लिए, देखें: $ आयनिकपॉप


यह वास्तव में साफ दिखता है, हालांकि मुझे लगता है कि यह कोणीय में घोषणात्मक दृष्टिकोण के खिलाफ है। इस दृष्टिकोण के साथ नियंत्रक के अंदर दृश्य तर्क रखना आसान है। यदि कोई कर सकता है, तो यह यूआई तत्वों से नियंत्रक को साफ रखने में मददगार हो सकता है।
जिम अहो

1
आप छुटकारा पा सकते हैं == true, जो इस मामले में पूरी तरह से अनावश्यक है, क्योंकि confirm()पहले से ही एक बूलियन वापस कर देता है। जेएस को इसे टाइप करने और इसे सच करने के लिए तुलना करने की आवश्यकता नहीं है।
लेओ लैम

10

कोर जावास्क्रिप्ट + कोणीय js का उपयोग कर इसका इतना सरल:

$scope.delete = function(id) 
    { 
       if (confirm("Are you sure?"))
           {
                //do your process of delete using angular js.
           }
   }

यदि आप ओके पर क्लिक करते हैं, तो डिलीट ऑपरेशन होगा, अन्यथा नहीं। * आईडी वह पैरामीटर है, जिसे आप हटाना चाहते हैं।


5

आप इसका उपयोग नहीं करना चाहते हैं terminal: falseक्योंकि यह बटन के अंदर के प्रसंस्करण को रोक रहा है। इसके बजाय, डिफ़ॉल्ट व्यवहार को रोकने के लिए अपने linkस्पष्ट में attr.ngClick

http://plnkr.co/edit/EySy8wpeQ02UHGPBAIvg?p=preview

app.directive('ngConfirmClick', [
  function() {
    return {
      priority: 1,
      link: function(scope, element, attr) {
        var msg = attr.ngConfirmClick || "Are you sure?";
        var clickAction = attr.ngClick;
        attr.ngClick = "";
        element.bind('click', function(event) {
          if (window.confirm(msg)) {
            scope.$eval(clickAction)
          }
        });
      }
    };
  }
]);

एंगुलर के संस्करण में काम करता है जिसे आप प्लंकर में संदर्भित करते हैं, लेकिन यदि आप ajax.googleapis.com/ajax/libs/angularjs/1.2.15/angular.min.js का संदर्भ लेते हैं तो यह अपेक्षित रूप से काम नहीं करता है।
क्रिस डब्ल्यूआर

अल्टिमेटली मेरा सुझाया हुआ दृष्टिकोण केवल कुछ मामलों के लिए काम करता है, क्योंकि ngClick simlpy बाइंडिंग से अधिक 'क्लिक' करने का तरीका है। मुझे लगता है कि एक अलग विशेषता के बजाय एनजी-क्लिक हैंडलर में पुष्टि से निपटने के लिए अधिक सही दृष्टिकोण है।
Stepan Riha

4

आज की तारीख में यह समाधान मेरे लिए काम करता है:

/**
 * A generic confirmation for risky actions.
 * Usage: Add attributes: ng-really-message="Are you sure"? ng-really-click="takeAction()" function
 */
angular.module('app').directive('ngReallyClick', [function() {
    return {
        restrict: 'A',
        link: function(scope, element, attrs) {
            element.bind('click', function() {
                var message = attrs.ngReallyMessage;
                if (message && confirm(message)) {
                    scope.$apply(attrs.ngReallyClick);
                }
            });
        }
    }
}]);

क्रेडिट: https://gist.github.com/asafge/7430497#file-ng-really-js



4

कोणीय ng-clickलपेट के साथ काम करने वाला एक कोणीय एकमात्र समाधान संभव हैng-click अभिव्यक्ति ।

निर्देशक:

.directive('confirmClick', function ($window) {
  var i = 0;
  return {
    restrict: 'A',
    priority:  1,
    compile: function (tElem, tAttrs) {
      var fn = '$$confirmClick' + i++,
          _ngClick = tAttrs.ngClick;
      tAttrs.ngClick = fn + '($event)';

      return function (scope, elem, attrs) {
        var confirmMsg = attrs.confirmClick || 'Are you sure?';

        scope[fn] = function (event) {
          if($window.confirm(confirmMsg)) {
            scope.$eval(_ngClick, {$event: event});
          }
        };
      };
    }
  };
});

HTML:

<a ng-click="doSomething()" confirm-click="Are you sure you wish to proceed?"></a>

3
    $scope.MyUpdateFunction = function () {
        var retVal = confirm("Do you want to save changes?");
        if (retVal == true) {
            $http.put('url', myData).
            success(function (data, status, headers, config) {
                alert('Saved');
            }).error(function (data, status, headers, config) {
                alert('Error while updating');
            });
            return true;
        } else {
            return false;
        }
    }

कोड सब कुछ कहता है


1

HTML 5 कोड नमूना

<button href="#" ng-click="shoutOut()" confirmation-needed="Do you really want to
shout?">Click!</button>

AngularJs कस्टम निर्देश कोड-नमूना

var app = angular.module('mobileApp', ['ngGrid']);
app.directive('confirmationNeeded', function () {
    return {
    link: function (scope, element, attr) {
      var msg = attr.confirmationNeeded || "Are you sure?";
      var clickAction = attr.ngClick;
      element.bind('click',function (e) {
        scope.$eval(clickAction) if window.confirm(msg)
        e.stopImmediatePropagation();
        e.preventDefault();
       });
     }
    };
});

1

पुष्टि संवाद को AngularJS सामग्री का उपयोग करके लागू किया जा सकता है :

$ mdDialog उपयोगकर्ताओं को महत्वपूर्ण जानकारी के बारे में सूचित करने या निर्णय लेने के लिए उनकी आवश्यकता के लिए ऐप पर एक संवाद खोलता है। सेटअप के लिए दो दृष्टिकोण हैं: एक साधारण वादा एपीआई और नियमित ऑब्जेक्ट सिंटैक्स।

कार्यान्वयन उदाहरण: कोणीय सामग्री - संवाद


0

यदि आप यूआई-राउटर का उपयोग करते हैं, तो रद्द करें या स्वीकार करें बटन url को बदलें। इसे रोकने के लिए आप इस तरह के सशर्त वाक्य के प्रत्येक मामले में झूठे वापस कर सकते हैं:

app.directive('confirmationNeeded', function () {
  return {
    link: function (scope, element, attr) {
      var msg = attr.confirmationNeeded || "Are you sure?";
      var clickAction = attr.confirmedClick;
      element.bind('click',function (event) {
      if ( window.confirm(msg) )
        scope.$eval(clickAction);
      return false;
    });
  }
}; });

0

एक बहुत ही सरल कोणीय समाधान

आप एक संदेश के साथ या बिना आईडी का उपयोग कर सकते हैं। संदेश के बिना डिफ़ॉल्ट संदेश दिखाई देगा।

आदेश

app.directive('ngConfirmMessage', [function () {
    return {
        restrict: 'A',
        link: function (scope, element, attrs) {
            element.on('click', function (e) {
                var message = attrs.ngConfirmMessage || "Are you sure ?";
                if (!confirm(message)) {
                    e.stopImmediatePropagation();
                }
            });
        }
    }
}]);

नियंत्रक

$scope.sayHello = function(){
    alert("hello")
}

एचटीएमएल

एक संदेश के साथ

<span ng-click="sayHello()" ng-confirm-message="Do you want to say Hello ?" >Say Hello!</span>

बिना किसी गड़बड़ी के

<span ng-click="sayHello()" ng-confirm-message>Say Hello!</span>

0

यहाँ एक स्वच्छ और सरल कोणीय वादों का उपयोग कर समाधान है $q, $windowऔर देशी .confirm()मोडल:

angular.module('myApp',[])
  .controller('classicController', ( $q, $window ) => {
    this.deleteStuff = ( id ) => {
      $q.when($window.confirm('Are you sure ?'))
        .then(( confirm ) => {
          if ( confirm ) {
            // delete stuff
          }
        });
    };
  });

यहाँ मैं controllerAsसिंटैक्स और ES6 एरो फ़ंक्शंस का उपयोग कर रहा हूँ, लेकिन यह सादे ol 'ES5 में भी काम कर रहा है।


0

कोणीयज में बूटस्ट्रैप का उपयोग करके पुष्टिकरण पॉपअप हटाएं

बहुत आसान है .. मैं बूटस्ट्रैप सुधार पॉपअप का उपयोग करने के साथ इसके लिए एक समाधान है। यहाँ मुझे प्रदान किया गया है

<button ng-click="deletepopup($index)">Delete</button>

बूटस्ट्रैप मॉडल पॉपअप में:

<div class="modal-footer">
  <a href="" data-dismiss="modal" ng-click="deleteData()">Yes</a>
  <a href="" data-dismiss="modal">No</a>
</div>

js

var index=0;
$scope.deleteData=function(){
    $scope.model.contacts.splice(index,1);
}
// delete a row 
$scope.deletepopup = function ($index) {
    index=$index;
    $('#myModal').modal('show');
};

जब मैं डिलीट बटन पर क्लिक करता हूं तो बूटस्ट्रैप डिलीट कंफर्मेशन पॉपअप खुल जाएगा और जब मैं क्लिक करता हूं तो हां बटन पंक्ति डिलीट हो जाएगी।


0

एनजी-क्लिक रिटर्न 100% कार्यों की पुष्टि करता है

in html फ़ाइल कॉल delete_plot () फ़ंक्शन

<i class="fa fa-trash delete-plot" ng-click="delete_plot()"></i> 
 
  

इसे अपने कंट्रोलर में जोड़ें

    $scope.delete_plot = function(){
        check = confirm("Are you sure to delete this plot?")
        if(check){
            console.log("yes, OK pressed")
        }else{
            console.log("No, cancel pressed")

        }
    }

-1

काश एंगुलरजेएस में एक बिल्ट इन कन्फर्मेशन डायलॉग होता। अक्सर, यह ब्राउज़र एक में निर्मित उपयोग करने की तुलना में अनुकूलित संवाद करने के लिए अच्छा है।

मैंने संक्षेप में ट्विटर बूटस्ट्रैप का उपयोग किया था जब तक कि इसे संस्करण 6 के साथ बंद नहीं किया गया था। मैंने विकल्पों के लिए चारों ओर देखा, लेकिन जो मैंने पाया वह जटिल थे। मैंने JQuery UI एक की कोशिश करने का फैसला किया।

यहाँ मेरा नमूना है जिसे मैं कॉल करता हूं जब मैं एनजी-ग्रिड से कुछ निकालने वाला हूं;

    // Define the Dialog and its properties.
    $("<div>Are you sure?</div>").dialog({
        resizable: false,
        modal: true,
        title: "Modal",
        height: 150,
        width: 400,
        buttons: {
            "Yes": function () {
                $(this).dialog('close');
                //proceed with delete...
                /*commented out but left in to show how I am using it in angular
                var index = $scope.myData.indexOf(row.entity);

                $http['delete']('/EPContacts.svc/json/' + $scope.myData[row.rowIndex].RecordID).success(function () { console.log("groovy baby"); });

                $scope.gridOptions.selectItem(index, false);
                $scope.myData.splice(index, 1);
                */
            },
            "No": function () {
                $(this).dialog('close');
                return;
            }
        }
    });

मुझे उम्मीद है इससे किसी को सहायता मिलेगी। जब मैं ui-bootstrap-tpls.js को अपग्रेड करने की आवश्यकता थी, तो मैं अपने बाल खींच रहा था लेकिन इसने मेरे मौजूदा संवाद को तोड़ दिया। मैं आज सुबह काम पर आया, कुछ चीजों की कोशिश की और फिर महसूस किया कि मैं जटिल था।

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