jqh 5 anni fa
parent
commit
e7762d8c2b

+ 13 - 0
resources/assets/dcat/js/Dcat.js

@@ -5,6 +5,7 @@ import Translator from './extensions/Translator'
 let $ = jQuery,
     pjaxResponded = false,
     bootingCallbacks = [],
+    actions = {},
     defaultOptions = {
         pjax_container_selector: '#pjax-container',
     };
@@ -195,4 +196,16 @@ export default class Dcat {
     Translator(lang) {
         return new Translator(this, lang);
     }
+
+    // 注册动作
+    addAction(name, callback) {
+        if (typeof callback === 'function') {
+            actions[name] = callback;
+        }
+    }
+
+    // 获取动作
+    actions() {
+        return actions
+    }
 }

+ 32 - 20
resources/assets/dcat/js/bootstrappers/DataActions.js

@@ -1,16 +1,16 @@
 
-let actions = {
+let defaultActions = {
     // 刷新按钮
-    refreshAction: function (Dcat) {
-        $('[data-action="refresh"]').off('click').click(function () {
+    refresh: function ($action, Dcat) {
+        return function () {
             Dcat.reload($(this).data('url'));
-        });
+        };
     },
     // 删除按钮初始化
-    deleteAction: function (Dcat) {
+    delete: function ($action, Dcat) {
         let lang = Dcat.lang;
 
-        $('[data-action="delete"]').off('click').click(function() {
+        return function() {
             let url = $(this).data('url'),
                 redirect = $(this).data('redirect');
 
@@ -34,11 +34,11 @@ let actions = {
                     }
                 });
             });
-        });
+        };
     },
     // 批量删除按钮初始化
-    batchDeleteAction: function (Dcat) {
-        $('[data-action="batch-delete"]').off('click').on('click', function() {
+    'batch-delete': function ($action, Dcat) {
+        return function() {
             let url = $(this).data('url'),
                 name = $(this).data('name'),
                 keys = Dcat.grid.selected(name),
@@ -67,24 +67,25 @@ let actions = {
                     }
                 });
             });
-        });
+        };
     },
 
     // 图片预览
-    imagePreview: function (Dcat) {
-        $('[data-action="preview"]').off('click').click(function () {
+    'preview-img': function ($action, Dcat) {
+        return function () {
             return Dcat.previewImage($(this).attr('src'));
-        });
+        };
     },
 
-    popover: function () {
+    'popover': function ($action) {
         $('.popover').remove();
 
-        $('[data-action="popover"]').popover();
+        return function () {
+            $action.popover()
+        };
     },
 
-    // box-collapse
-    boxActions: function () {
+    'box-actions': function () {
         $('.box [data-action="collapse"]').click(function (e) {
             e.preventDefault();
 
@@ -98,13 +99,24 @@ let actions = {
             $(this).closest(".box").removeClass().slideUp("fast");
         });
     }
-
 };
 
 export default class DataActions {
     constructor(Dcat) {
-        for (let name in actions) {
-            actions[name](Dcat)
+        let actions = $.extend(defaultActions, Dcat.actions()),
+            $action,
+            name,
+            func;
+
+        for (name in actions) {
+            $action = $(`[data-action="${name}"]`);
+
+            func = actions[name]($action, Dcat);
+
+            if (typeof func === 'function') {
+                // 必须先取消再绑定,否则可能造成重复绑定的效果
+                $action.off('click').click(func);
+            }
         }
     }
 }

+ 10 - 13
resources/assets/dcat/js/bootstrappers/Pjax.js

@@ -7,9 +7,9 @@ export default class Pjax {
     }
 
     boot(Dcat) {
-        let container = Dcat.config.pjax_container_selector;
-
-        let _this = this;
+        let container = Dcat.config.pjax_container_selector,
+            formContainer = 'form[pjax-container]',
+            scriptContainer = 'script[data-exec-on-popstate]';
 
         $.pjax.defaults.timeout = 5000;
         $.pjax.defaults.maxCacheLength = 0;
@@ -22,13 +22,13 @@ export default class Pjax {
             event.preventDefault();
         });
 
-        $d.off('submit', 'form[pjax-container]').on('submit', 'form[pjax-container]', function (event) {
+        $d.off('submit', formContainer).on('submit', formContainer, function (event) {
             $.pjax.submit(event, container)
         });
 
         $d.on("pjax:popstate", function () {
             $d.one("pjax:end", function (event) {
-                $(event.target).find("script[data-exec-on-popstate]").each(function () {
+                $(event.target).find(scriptContainer).each(function () {
                     $.globalEval(this.text || this.textContent || this.innerHTML || '');
                 });
             });
@@ -36,21 +36,18 @@ export default class Pjax {
 
         $d.on('pjax:send', function (xhr) {
             if (xhr.relatedTarget && xhr.relatedTarget.tagName && xhr.relatedTarget.tagName.toLowerCase() === 'form') {
-                var $submit_btn = $('form[pjax-container] :submit');
-                if ($submit_btn) {
-                    $submit_btn.button('loading')
-                }
+                $(formContainer + ' :submit').button('loading');
             }
             Dcat.NP.start();
         });
 
         $d.on('pjax:complete', function (xhr) {
             if (xhr.relatedTarget && xhr.relatedTarget.tagName && xhr.relatedTarget.tagName.toLowerCase() === 'form') {
-                var $submit_btn = $('form[pjax-container] :submit');
-                if ($submit_btn) {
-                    $submit_btn.button('reset')
-                }
+                $(formContainer + ' :submit').button('reset')
             }
+        });
+
+        $d.on('pjax:loaded', () => {
             Dcat.NP.done();
         });
     }