カスタムangularjsディレクティブを使用してng-click
の確認ダイアログを設定しようとしています。
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
ng-click
を使用しなくても構わない場合は、問題なく動作します。クリックハンドラが2度起動されるのを避けながら、別の名前に変更して属性を読み取ることができます。
http://plnkr.co/edit/YWr6o2?p=preview
私は問題はterminal
が他のディレクティブを実行しないように指示することだと思います。 {{ }}
によるデータバインディングはng-bind
ディレクティブの単なるエイリアスであり、おそらくterminal
によってキャンセルされます。
更新:旧回答(2014)
これは基本的にng-click
イベントをインターセプトし、ng-confirm-click="message"
ディレクティブに含まれるメッセージを表示してユーザーに確認を求めます。 confirmをクリックすると通常の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();
}
});
}
}
}
]);
Zach Snowのコードクレジット: http://zachsnow.com/#!/blog/2013/confirming-ng-click/
更新:新しい答え(2016)
1)前者(ng)はネイティブのangleディレクティブ用に予約されているため、接頭辞をngからmwに変更しました。
2)ng-clickイベントを傍受する代わりに関数とメッセージを渡すようにディレクティブを修正しました。
3)デフォルトの「よろしいですか?」を追加しました。カスタムメッセージがmw-confirm-click-message = ""に提供されていない場合のmessage。
<!-- 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();
}
});
}
}
}
]);
私にとっては、 https://www.w3schools.com/js/js_popup.asp 、ブラウザのデフォルトの確認ダイアログボックスがとても役に立ちました。ただこれを試してみました:
$scope.delete = function() {
if (confirm("sure to delete")) {
// todo code for deletion
}
};
単純な.. :)
しかし、私はあなたがそれをカスタマイズすることができないと思います。 「キャンセル」または「OK」ボタンで表示されます。
編集:
イオンフレームワークを使用している場合は、次のようにIonPopupダイアログを使用する必要があります。
// 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
}
});
};
詳細については、 $ionicPopup を参照してください。
コアjavascript + angular jsを使ってとても簡単です:
$scope.delete = function(id)
{
if (confirm("Are you sure?"))
{
//do your process of delete using angular js.
}
}
[OK]をクリックすると、削除操作が実行されます。それ以外の場合は削除されません。 * idは、削除したいレコードです。
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)
}
});
}
};
}
]);
今日の日付では、この解決策は私のために働く:
/**
* 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
ng-click
式をラップするためにcompileを使用することによって、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>
私はAngular-UI $モーダルサービスに依存するまさにそのためのモジュールを作成しました。
$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;
}
}
コードはすべてを言います
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();
});
}
};
});
確認ダイアログは AngularJS Material を使って実装できます。
$ mdDialogは、重要な情報についてユーザーに通知したり、決定を下すようにユーザーに要求するためのアプリ上のダイアログを開きます。セットアップには2つのアプローチがあります。単純な約束のAPIと通常のオブジェクト構文です。
Ui-routerを使用している場合は、[キャンセル]または[承認]ボタンをクリックしてURLを置き換えます。これを防ぐために、次のような条件付き文のそれぞれの場合にfalseを返すことができます。
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;
});
}
}; });
idはメッセージ付きでもなしでも使用できます。メッセージがなければ、デフォルトのメッセージが表示されます。
指令
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")
}
HTML
メッセージ付き
<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>
これは、角度付きの約束$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のarrow関数を使っていますが、普通のES5でも動いています。
非常に単純な..私はブートストラップ立体配座ポップアップを使用してこれのための一つの解決策があります。ここで私は提供されています
<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');
};
削除ボタンをクリックするとブートストラップ削除の確認ポップアップが開き、はいをクリックすると削除されます。