jqh 5 年之前
父节点
当前提交
50a96f6481
共有 3 个文件被更改,包括 94 次插入70 次删除
  1. 41 36
      src/Grid/Displayers/Checkbox.php
  2. 38 33
      src/Grid/Displayers/Radio.php
  3. 15 1
      src/Widgets/HasAjaxRequest.php

+ 41 - 36
src/Grid/Displayers/Checkbox.php

@@ -40,7 +40,7 @@ EOT;
         Admin::script($this->script());
 
         return <<<EOT
-<form class="form-group grid-checkbox-$name" style="text-align:left;" data-key="{$this->key()}">
+<form class="form-group {$this->elementClass()}" style="text-align:left;" data-key="{$this->key()}">
     $radios
     <button type="submit" class="btn btn-primary btn-xs pull-left">
         <i class="fa fa-save"></i>&nbsp;{$this->trans('save')}
@@ -52,47 +52,52 @@ EOT;
 EOT;
     }
 
-    protected function script()
+    protected function elementClass()
     {
-        $name = $this->column->getName();
+        return 'grid-checkbox-'.$this->column->getName();
+    }
 
+    protected function script()
+    {
         return <<<JS
-var _ckreq;
-$('form.grid-checkbox-$name').on('submit', function () {
-    var values = $(this).find('input:checkbox:checked').map(function (_, el) {
-        return $(el).val();
-    }).get(), btn = $(this).find('[type="submit"]');
-    
-    if (_ckreq) return;
-    _ckreq = 1;
+(function () {
+    var f;
+    $('form.{$this->elementClass()}').on('submit', function () {
+        var values = $(this).find('input:checkbox:checked').map(function (_, el) {
+            return $(el).val();
+        }).get(), btn = $(this).find('[type="submit"]');
+        
+        if (f) return;
+        f = 1;
+        
+        btn.button('loading');
     
-    btn.button('loading');
-
-    var data = {
-        $name: values,
-        _token: LA.token,
-        _method: 'PUT'
-    };
+        var data = {
+            {$this->column->getName()}: values,
+            _token: LA.token,
+            _method: 'PUT'
+        };
+        
+        $.ajax({
+            url: "{$this->resource()}/" + $(this).data('key'),
+            type: "POST",
+            contentType: 'application/json;charset=utf-8',
+            data: JSON.stringify(data),
+            success: function (data) {
+                btn.button('reset');
+                f = 0;
+                LA.success(data.message);
+            },
+            error: function (a, b, c) {
+                btn.button('reset');
+                f = 0;
+                LA.ajaxError(a, b, c);
+            },
+        });
     
-    $.ajax({
-        url: "{$this->resource()}/" + $(this).data('key'),
-        type: "POST",
-        contentType: 'application/json;charset=utf-8',
-        data: JSON.stringify(data),
-        success: function (data) {
-            btn.button('reset');
-            _ckreq = 0;
-            LA.success(data.message);
-        },
-        error: function (a, b, c) {
-            btn.button('reset');
-            _ckreq = 0;
-            LA.ajaxError(a, b, c);
-        },
+        return false;
     });
-
-    return false;
-});
+})();
 JS;
     }
 }

+ 38 - 33
src/Grid/Displayers/Radio.php

@@ -3,6 +3,7 @@
 namespace Dcat\Admin\Grid\Displayers;
 
 use Dcat\Admin\Admin;
+use Illuminate\Support\Str;
 
 class Radio extends AbstractDisplayer
 {
@@ -16,7 +17,7 @@ class Radio extends AbstractDisplayer
         $name = $this->column->getName();
 
         foreach ($options as $value => $label) {
-            $id = 'rdo'.\Illuminate\Support\Str::random(8);
+            $id = 'rdo'.Str::random(8);
 
             $checked = ($value == $this->value) ? 'checked' : '';
             $radios .= <<<EOT
@@ -30,7 +31,7 @@ EOT;
         Admin::script($this->script());
 
         return <<<EOT
-<form class="form-group grid-radio-$name" style="text-align: left" data-key="{$this->key()}">
+<form class="form-group {$this->elementClass()}" style="text-align: left" data-key="{$this->key()}">
     $radios
     <button type="submit" class="btn btn-primary btn-xs pull-left">
         <i class="fa fa-save"></i>&nbsp;{$this->trans('save')}
@@ -42,43 +43,47 @@ EOT;
 EOT;
     }
 
-    protected function script()
+    protected function elementClass()
     {
-        $name = $this->column->getName();
+        return 'grid-radio-'.$this->column->getName();
+    }
 
+    protected function script()
+    {
         return <<<JS
-var _ckreq;
-$('form.grid-radio-$name').on('submit', function () {
-    var value = $(this).find('input:radio:checked').val(), btn = $(this).find('[type="submit"]');
+(function () {
+    var f;
+    $('form.{$this->elementClass()}').on('submit', function () {
+        var value = $(this).find('input:radio:checked').val(), btn = $(this).find('[type="submit"]');
+        
+        if (f) return;
+        f = 1;
+        
+        btn.button('loading');
     
-    if (_ckreq) return;
-    _ckreq = 1;
+        $.ajax({
+            url: "{$this->resource()}/" + $(this).data('key'),
+            type: "POST",
+            data: {
+                {$this->column->getName()}: value,
+                _token: LA.token,
+                _method: 'PUT'
+            },
+            success: function (data) {
+                btn.button('reset');
+                f = 0;
+                LA.success(data.message);
+            },
+            error: function (a, b, c) {
+                btn.button('reset');
+                f = 0;
+                LA.ajaxError(a, b, c);
+            },
+        });
     
-    btn.button('loading');
-
-    $.ajax({
-        url: "{$this->resource()}/" + $(this).data('key'),
-        type: "POST",
-        data: {
-            $name: value,
-            _token: LA.token,
-            _method: 'PUT'
-        },
-        success: function (data) {
-            btn.button('reset');
-            _ckreq = 0;
-            LA.success(data.message);
-        },
-        error: function (a, b, c) {
-            btn.button('reset');
-            _ckreq = 0;
-            LA.ajaxError(a, b, c);
-        },
+        return false;
     });
-
-    return false;
-});
-
+})()
 JS;
     }
 }

+ 15 - 1
src/Widgets/HasAjaxRequest.php

@@ -164,10 +164,24 @@ trait HasAjaxRequest
 
         return <<<JS
 (function () {
+    var f;
     function request(p) {
+        if (f) return;
+        f = 1;
+        
         $fetching;     
-        $.getJSON('{$this->__url}', $.extend({_token:LA.token}, p || {}), function (response) {
+        $.ajax({
+          url: '{$this->__url}',
+          dataType: 'json',
+          data: $.extend({_token:LA.token}, p || {}),
+          success: function (response) {
+            f = 0;
             {$fetched};
+          },
+          error: function (a, b, c) {
+              f = 0;
+              LA.ajaxError(a, b, c)
+          },
         });
     }
     request();