Динамический стол - автошоу - PullRequest
0 голосов
/ 08 октября 2018

У меня есть следующий код, где я редактирую поле строки в таблице, но я хочу, чтобы оно было более динамичным, то есть при редактировании поля оно переходит к следующему полю, в котором я буду редактировать.У меня есть функция успеха, где я должен перейти к следующему полю, чтобы отредактировать, каким будет элемент, но я не знаю, почему он не работает.

$('#table').editable({
        container: 'body',
        selector: 'td.task',
        title: 'task',
        type: "POST",
        showbuttons: false,
         type: 'text',
        validate: function(value) {
            if ($.trim(value) == '') {
                return 'Empty!';
            }
        },  
        success: function(response) {
     //WITH THIS CODE I COULD JUMP BUT THE LIST GIVE A ERROR AND CREATE A NEW TR WITH TD
           $(this).parent().find(".Item").click();
        }
    });
    var ITEM = [];
    $.each({
        "Item1": "Item1",
        "Item2": "Item2",
        "Item3": "Item3",
        "Item4": "Item4"
    }, function(k, v) {
        ITEM.push({
            value: k,
            text: v
        });
    });
    
    $('#table').editable({
        container: 'body',
        selector: 'td.Item',
        title: 'Item',
        type: "POST",
        showbuttons: false,
        source: ITEM,
        validate: function(value) {
            if ($.trim(value) == '') {
                return 'Empty!';
            }
        }
    });
<link href="//netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap.min.css" rel="stylesheet">
<script src="http://code.jquery.com/jquery-2.1.1.min.js"></script> 
<script src="//netdna.bootstrapcdn.com/bootstrap/3.0.0/js/bootstrap.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/x-editable/1.5.0/bootstrap3-editable/js/bootstrap-editable.min.js"></script>
<link href="https://cdnjs.cloudflare.com/ajax/libs/x-editable/1.5.0/bootstrap3-editable/css/bootstrap-editable.css" rel="stylesheet"/>

<table id="table" class="table table-bordered">
  <thead>
    <tr>
      <th>Id</th>
      <th>Task</th>
      <th>Item</th>
    </tr>
  </thead>
  <tbody>
  <tr>
  <td>1</td>
  <td data-name="task" class="task" data-type="text">001</td>
  <td data-name="Item" class="Item" data-type="select">Item2</td>
  </tr>
    <tr>
  <td>2</td>
  <td data-name="task" class="task" data-type="text">002</td>
  <td data-name="Item" class="Item" data-type="select">Item1</td>
  </tr>
  </tbody>
</table>

Я видел пример на следующей странице. ссылка необходимо нажать на флажок автоматического открытия следующего поля в момент редактирования этого перехода к следующему полю для редактирования.Я хотел бы что-то подобное, надеюсь, я хорошо объяснил себя.

ОБНОВЛЕНИЕ: я добавляю строку кода в мою функцию успеха, но выбор дает ошибку Error when loading list, и в таблице создается новый <tr> with <td>

Ответы [ 4 ]

0 голосов
/ 11 октября 2018

Пожалуйста, попробуйте еще раз.Это поможет вам:)

$('#table').editable({
  container: 'body',
  selector: 'td.task',
  title: 'task',
  type: "POST",
  showbuttons: false,
  type: 'text',
  validate: function(value) {
    if ($.trim(value) == '') {
      return 'Empty!';
    }
  },
  success: function(response) {

    //CODE TO JUMP TO THE SELECT 
  }
});
var ITEM = [];
$.each({
  "Item1": "Item1",
  "Item2": "Item2",
  "Item3": "Item3",
  "Item4": "Item4"
}, function(k, v) {
  ITEM.push({
    value: k,
    text: v
  });
});

$('#table').editable({
  container: 'body',
  selector: 'td.Item',
  title: 'Item',
  type: "POST",
  showbuttons: false,
  source: ITEM,
  validate: function(value) {
    if ($.trim(value) == '') {
      return 'Empty!';
    }
  }
});

$('#table .task').on('hidden', function(e, reason) {

  if (reason === 'save' || reason === 'nochange') {
    $(this).parent().find(".Item").click();
  }
});
<link href="//netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap.min.css" rel="stylesheet">
<script src="http://code.jquery.com/jquery-2.1.1.min.js"></script>
<script src="//netdna.bootstrapcdn.com/bootstrap/3.0.0/js/bootstrap.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/x-editable/1.5.0/bootstrap3-editable/js/bootstrap-editable.min.js"></script>
<link href="https://cdnjs.cloudflare.com/ajax/libs/x-editable/1.5.0/bootstrap3-editable/css/bootstrap-editable.css" rel="stylesheet" />

<table id="table" class="table table-bordered">
  <thead>
    <tr>
      <th>Id</th>
      <th>Task</th>
      <th>Item</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>1</td>
      <td data-name="task" class="task" data-type="text">001</td>
      <td data-name="Item" class="Item" data-type="select">Item2</td>
    </tr>
    <tr>
      <td>2</td>
      <td data-name="task" class="task" data-type="text">002</td>
      <td data-name="Item" class="Item" data-type="select">Item1</td>
    </tr>
  </tbody>
</table>
0 голосов
/ 11 октября 2018

К счастью, поскольку вы ссылались на рабочий пример, я смог изучить код.Кстати, вы можете сделать это, просто открыв инструменты разработчика в вашем браузере.Я использую Chrome, так что для меня это просто F12.В исходном коде я обнаружил следующее:

   $('#user .editable').on('hidden', function(e, reason){
        if(reason === 'save' || reason === 'nochange') {
            var $next = $(this).closest('tr').next().find('.editable');
            if($('#autoopen').is(':checked')) {
                setTimeout(function() {
                    $next.editable('show');
                }, 300); 
            } else {
                $next.focus();
            } 
        }
   });

Код читается почти как на английском, поэтому, я думаю, за ним довольно легко следовать.Когда редактор закрыт, мы сначала проверяем причину его закрытия.Затем код находит следующее поле и открывает редактор, если установлен флажок «автоматически открывать следующее текстовое поле».Здесь интересно видеть, что это делается с тайм-аутом вместо простого вызова $next.editable('show'); Это может быть важно или просто для галочки.

В вашем коде вы захотите найти какой-нибудь объединяющий селектордля ваших вещей.Я думаю, что самый простой способ сделать это - просто добавить .editable к исходному источнику и назвать его так, как они делают в демоверсии.

Итак, для вашего HTML:

<table id="table" class="table table-bordered">
  <thead>
    <tr>
      <th>Id</th>
      <th>Task</th>
      <th>Item</th>
    </tr>
  </thead>
  <tbody>
  <tr>
  <td>1</td>
  <td data-name="task" class="editable task" data-type="text">001</td>
  <td data-name="Item" class="editable Item" data-type="select">Item2</td>
  </tr>
    <tr>
  <td>2</td>
  <td data-name="task" class="editable task" data-type="text">002</td>
  <td data-name="Item" class="editable Item" data-type="select">Item1</td>
  </tr>
  </tbody>
</table>

Обратите внимание на добавленный класс на тегах td.(РЕДАКТИРОВАТЬ: сумасшедший, не заметил, что уже был атрибут класса)

Затем вы можете эмулировать код демонстрационной js, но будьте осторожны, потому что переменная $next не может быть выбрана таким же образом.Ваш DOM-макет не совпадает, так как у вас есть более одной редактируемой ячейки в строке:

   $('#table .editable').on('hidden', function(e, reason){
        if(reason === 'save' || reason === 'nochange') {
            var $next = $(this).nextAll().find('.editable');
            if ($next.length > 0) {
                $next = $next[0];
            } else {
                $next = $(this).closest('tr').next().find('.editable');
                if ($next.length > 0) {
                    $next = $next[0];
                } else {
                    return; // No editable fields remaining.
                }
            }
            setTimeout(function() { $next.editable('show'); }, 300); 
        }
   });

Я должен отрицать, что я не проверял выше, но это должно дать вам хорошую отправную точку для получениясобирается.Выбор следующего поля, вероятно, можно сделать намного лучше, чем у меня, но у меня просто нет среды тестирования, чтобы проверить это правильно.

РЕДАКТИРОВАТЬ : I 'Мы заметили, что в perhapse вы хотите перейти только к полю выбора, но не обязательно от выбора к элементу в следующей строке.В этом случае код будет немного проще.

Во-первых, вам не нужен класс editable, поэтому вы можете просто использовать HTML-код, который у вас уже есть, но в js вынужно правильно обращаться к селекторам:

   $('#table .task').on('hidden', function(e, reason){
        if(reason === 'save' || reason === 'nochange') {
            var $next = $(this).nextAll().find('.Item');
            setTimeout(function() { $next.editable('show'); }, 300); 
        }
   });

И это должно быть.Когда редактор выбора закрывается, следующее поле не будет выбрано автоматически.

0 голосов
/ 11 октября 2018

Я только что изменил $(this).parent().find(".Item").editable('toggle'); на $(this).parent().find(".Item").click();

$('#table').editable({
        container: 'body',
        selector: 'td.task',
        title: 'task',
        type: "POST",
        showbuttons: false,
         type: 'text',
        validate: function(value) {
            if ($.trim(value) == '') {
                return 'Empty!';
            }
        },  
        success: function(response) {
     //WITH THIS CODE I COULD JUMP BUT THE LIST GIVE A ERROR AND CREATE A NEW TR WITH TD
           $(this).parent().find(".Item").click();
        }
    });
    var ITEM = [];
    $.each({
        "Item1": "Item1",
        "Item2": "Item2",
        "Item3": "Item3",
        "Item4": "Item4"
    }, function(k, v) {
        ITEM.push({
            value: k,
            text: v
        });
    });
    
    $('#table').editable({
        container: 'body',
        selector: 'td.Item',
        title: 'Item',
        type: "POST",
        showbuttons: false,
        source: ITEM,
        validate: function(value) {
            if ($.trim(value) == '') {
                return 'Empty!';
            }
        }
    });
<link href="//netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap.min.css" rel="stylesheet">
<script src="http://code.jquery.com/jquery-2.1.1.min.js"></script> 
<script src="//netdna.bootstrapcdn.com/bootstrap/3.0.0/js/bootstrap.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/x-editable/1.5.0/bootstrap3-editable/js/bootstrap-editable.min.js"></script>
<link href="https://cdnjs.cloudflare.com/ajax/libs/x-editable/1.5.0/bootstrap3-editable/css/bootstrap-editable.css" rel="stylesheet"/>

<table id="table" class="table table-bordered">
  <thead>
    <tr>
      <th>Id</th>
      <th>Task</th>
      <th>Item</th>
    </tr>
  </thead>
  <tbody>
  <tr>
  <td>1</td>
  <td data-name="task" class="task" data-type="text">001</td>
  <td data-name="Item" class="Item" data-type="select">Item2</td>
  </tr>
    <tr>
  <td>2</td>
  <td data-name="task" class="task" data-type="text">002</td>
  <td data-name="Item" class="Item" data-type="select">Item1</td>
  </tr>
  </tbody>
</table>

Я думаю, что ваша ошибка появляется, потому что нет значения по умолчанию, сначала попробуйте изменить элемент, затем измените текст в вашем фрагменте

0 голосов
/ 11 октября 2018

$('#table').editable({
        container: 'body',
        selector: 'td.task',
        title: 'task',
        type: "POST",
        showbuttons: false,
         type: 'text',
        validate: function(value) {
            if ($.trim(value) == '') {
                return 'Empty!';
            }
        },  
        success: function(response) {
          
           //CODE TO JUMP TO THE SELECT 
        }
    });
    var ITEM = [];
    $.each({
        "Item1": "Item1",
        "Item2": "Item2",
        "Item3": "Item3",
        "Item4": "Item4"
    }, function(k, v) {
        ITEM.push({
            value: k,
            text: v
        });
    });
    
    $('#table').editable({
        container: 'body',
        selector: 'td.Item',
        title: 'Item',
        type: "POST",
        showbuttons: false,
        source: ITEM,
        validate: function(value) {
            if ($.trim(value) == '') {
                return 'Empty!';
            }
        }
    });

    $('#table .task').on('hidden', function(e, reason){
     
      if(reason === 'save' || reason === 'nochange') {
          var $next = $(this).closest('tr').next().find('.task');
        
        setTimeout(function() {
            $next.editable('show');
        }, 300);
      }
   });
   
   $('#table .Item').on('hidden', function(e, reason){
     
      if(reason === 'save' || reason === 'nochange') {
          var $next = $(this).closest('tr').next().find('.Item');
        
        setTimeout(function() {
            $next.editable('show');
        }, 300);
      }
   });
<link href="//netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap.min.css" rel="stylesheet">
<script src="http://code.jquery.com/jquery-2.1.1.min.js"></script> 
<script src="//netdna.bootstrapcdn.com/bootstrap/3.0.0/js/bootstrap.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/x-editable/1.5.0/bootstrap3-editable/js/bootstrap-editable.min.js"></script>
<link href="https://cdnjs.cloudflare.com/ajax/libs/x-editable/1.5.0/bootstrap3-editable/css/bootstrap-editable.css" rel="stylesheet"/>

<table id="table" class="table table-bordered">
  <thead>
    <tr>
      <th>Id</th>
      <th>Task</th>
      <th>Item</th>
    </tr>
  </thead>
  <tbody>
  <tr>
  <td>1</td>
  <td data-name="task" class="task" data-type="text">001</td>
  <td data-name="Item" class="Item" data-type="select">Item2</td>
  </tr>
    <tr>
  <td>2</td>
  <td data-name="task" class="task" data-type="text">002</td>
  <td data-name="Item" class="Item" data-type="select">Item1</td>
  </tr>
  </tbody>
</table>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...