Nano Hash - криптовалюты, майнинг, программирование

Автозаполнение Grails Richui для передачи объекта в функцию или обновления идентификатора объекта

У меня есть таблица с множеством полей автозаполнения, которые выглядят так...

<richui:autoComplete style="width:500px" name="objSelect[${newRow-1}].id" value= "" action="${createLinkTo('dir': 'object/searchAJAX')}" forceSelection = "true" maxResultsDisplayed="20" minQueryLength ="3" onItemSelect="updateHiddenInput(id,${newRow-1})" />

У меня есть вызов функции с именем updateHiddenInput, когда пользователь выбирает значение, передаваемое в выбранном идентификаторе, а также строку, в которой находится автозаполнение (эта функция затем обновляет скрытое поле в той же строке, используя переданные значения, с удостоверением личности). Функция выглядит так: -

function updateHiddenInput(id, num){
    var objID = "objectID[" + num + "].id";
    $(document.getElementById(objID)).val(id);
}

Все работает, пока я не добавлю новую строку в свою таблицу, это сдвинет все вниз на одну строку и не позволит автозаполнению обновить скрытое поле правильных строк (поскольку оно все еще ссылается на старую строку).

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

Единственная другая альтернатива, о которой я мог бы подумать, - это просто пройти через сам объект, а также идентификатор, который я затем могу найти скрытым на основе объекта, но я не могу понять, как это сделать, любые предложения с благодарностью получены! :С

Я пытался изменить onItemSelect="updateHiddenInput(id,${newRow-1})" на onItemSelect="updateHiddenInput(id,this)"

Теоретически я могу просто пройти через объект автозаполнения и оттуда просто пройти по странице, чтобы найти скрытое поле, которое я хочу обновить. Однако, когда я затем пытаюсь использовать этот объект в своей функции, например, с чем-то вроде: -

var mynumber = $(myobject).closest('td').find('input').val();

Я всегда получаю "неопределенное" значение, когда пытаюсь вернуть значение...

Если я просто вставлю alert(myobject) в функцию, она вернет AutoComplete instance0 autoLook[0].id, но если я вставил новые строки, значение id не изменится (т. е. id объекта теперь autoLook[3].id, но он по-прежнему показывает [0], который Я думаю, что это может быть частью проблемы, но теперь у меня есть идея, как я могу обновить это значение...

Я замечаю, что при просмотре firebug в html есть /script, связанный с автозаполнением, что может быть проблемой, поскольку оно не обновляется при добавлении новых строк, и я вижу несколько ссылок на старое/исходное значение идентификатора (см. ниже), так что, возможно, прохождение через this не передает текущие значения объектов через...?

<script type="text/javascript">
var autoCompleteDataSource = new YAHOO.util.XHRDataSource("/Framework/object/searchAJAX");
autoCompleteDataSource.responseType = YAHOO.util.XHRDataSource.TYPE_XML;
autoCompleteDataSource.responseSchema = {
resultNode : "result",
fields : [
{ key: "name" },
{ key: "id" }
]
};
;
autoComplete = new YAHOO.widget.AutoComplete('autoLook[0].id','ad186a42e45d14d5cde8281514f877e42', autoCompleteDataSource);
autoComplete.queryDelay = 0;
autoComplete.prehighlightClassName = 'yui-ac-prehighlight';
autoComplete.useShadow = false;
autoComplete.minQueryLength = 3;
autoComplete.typeAhead = false;
autoComplete.forceSelection = true;
autoComplete.maxResultsDisplayed = 20;
autoComplete.shadow = false;
var itemSelectHandler = function(sType, args) {
var autoCompleteInstance = args[0];
var selectedItem = args[1];
var data = args[2];
var id = data[1];
updateHiddenInput(id,this) };
autoComplete.itemSelectEvent.subscribe(itemSelectHandler);
</script>

Моя благодарность пользователю 1690588 за всю его помощь! :)

При дальнейшем копании я убедился, что мои проблемы сводятся к строке autoComplete = new YAHOO.widget.AutoComplete('autoLook[0].id','a5b57b386a2d1c283068b796834050186', autoCompleteDataSource);, а именно к той части, где она вводит autoLook[].id, и если бы я мог изменить это, все было бы в порядке, но эта строка генерируется автоматически, и я понятия не имею, как обновить его, у кого-нибудь есть подобный опыт?


  • Как вы добавляете новую строку в таблицу? 18.11.2013
  • Я добавляю его через вызов AJAX, который просто срабатывает, генерирует html и psots. После того, как это сделано, он проходит и переименовывает все элементы в таблице. 18.11.2013
  • Я понял, что могу изменить onItemSelect="updateHiddenInput(id,${newRow-1})" на onItemSelect="updateHiddenInput(id,\$(this))", что затем позволит мне передать $(this) функции (если я alert($(this)), я получу object Object обратно). Но теперь я не могу понять, как перейти от этого к строке, на которой находится $(this)...! Alertnig $(this).id ничего не делает... :/ 18.11.2013
  • Извините, что немного мутит воду, это просто переменная, которая сообщает, в какой строке она находится. этот код взят из фрагмента, который я вставляю при создании сообщения AJAX (он сообщает ему, какая строка должна закончиться), он просто заканчивается как число, идентифицирующее строку, в которой он находится... 18.11.2013
  • Я не уверен, что добавление в \$(this) на самом деле вообще проходит через объект, так как независимо от того, что я пытаюсь, я не могу получить от него никакой информации (можете ли вы отправить пустые объекты ..?) 18.11.2013
  • Попробуйте только this вместо \$(this) 18.11.2013
  • проклятия, похоже, что переименование объекта не меняет детали, переданные с помощью this, даже несмотря на то, что у элемента было обновлено его имя / идентификатор :( Вернемся к исходной точке, если только я не могу использовать this каким-либо образом, чтобы найти фактический объект на странице и определить, какая строка находится в таблице...? 19.11.2013
  • давайте продолжим это обсуждение в чате 19.11.2013

Ответы:


1

У меня нет особого представления о вашей странице gsp, но я попробовал ее на своей стороне:

Мой gsp:

<!DOCTYPE html>
<html>
<head>
<resource:autoComplete skin="default"/>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script type="text/javascript">
    var counter = ${list.size()};

    function asd() {
        jQuery.ajax({
            url: " ${createLink(controller: 'oauthCallBack', action: 'testAuto')}",
            data: "idx=" + counter++,
            success: function (data) {
                jQuery("#tableId").append("<tr><td>" + data + "</td></tr>");
            }
        });
    }

    function updateHiddenInput(id, tg) {
        jQuery(tg).val(id);
    }
</script>
</head>

<body>
<g:form>
<table id="tableId">
    <g:each in="${list}" var="vr" status="idx">
        <tr>
            <td>
                <richui:autoComplete name="name" id="uniqueId${idx}" action="${createLinkTo('dir': 'oauthCallBack/test')}" onItemSelect="updateHiddenInput(id, someId${idx})"/>
                <g:hiddenField name="someName" id="someId${idx}" value=""/>
            </td>
        </tr>
    </g:each>
</table>
</g:form>
<button onclick="asd()">Add</button>
</body>
</html>

Мое действие:

def testAuto() {
    render template: 'addNew', model: [idx: params.idx]
}

Мой шаблон (addNew):

<richui:autoComplete name="name" id="uniqueId${idx}" action="${createLinkTo('dir': 'oauthCallBack/test')}"
                 onItemSelect="updateHiddenInput(id, someId${idx})"/>
<g:hiddenField name="someName" id="someId${idx}" value=""/>

Попробуй это..,.



РЕДАКТИРОВАНИЕ................................................... ......................................

Я предположил, что вы успешно обновили все имена полей ввода. Затем вы можете редактировать скрытое поле, например:

Просмотр:

<tr class="dummyClass">
    <td>
        <richui:autoComplete name="name[${idx}]" id="uniqueId[${idx}]" action="${createLinkTo('dir': 'oauthCallBack/test')}" onItemSelect="updateHiddenInput(id, this)"/>
        <g:hiddenField name="someName[${idx}]" id="someId[${idx}]" value=""/>
    </td>
</tr>

jQuery:

function updateHiddenInput(id, tg) {
    jQuery(tg._elTextbox).closest("tr.dummyClass").find("input[type=hidden]").val(id);
}


РЕДАКТИРОВАНИЕ................................................... ......................................

Почему вам нужно изменить «id»? Для отправки значений по порядку достаточно изменить имя. И вы можете обновить скрытое поле без идентификатора, как указано выше.

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

19.11.2013
  • Спасибо за предложение, но проблема в том, что когда я вставляю другую строку в таблицу, я переименовываю все входы по порядку (таким образом, 1 становится 2, 2 становится 3 и т. д.), и таким образом всегда будет ссылаться на исходный someId${idx} и начать обновление неправильное поле. Я надеялся каким-то образом передать объект автозаполнения в функцию, чтобы затем я мог динамически определить, где он находился на странице, и найти связанное с ним скрытое поле, но передача объекта не работает: S 20.11.2013
  • Почему вы переименовываете входы? Я также добавил строку в таблицу, и она работает нормально, не нужно менять имя входов. 20.11.2013
  • В вашем примере строка добавляется в конец, тогда как в моем примере я также дал пользователю возможность добавлять строки в середину таблицы или перетаскивать строки вверх и вниз, чтобы сбросить их место (таблица представляет собой последовательность «событий ' как часть теста. Когда я сохраняю эти значения обратно в базу данных, мне нужно знать, в каком порядке они находятся, чтобы они сохранялись и вызывались в правильном порядке, и то, как я это делал в то время, использовало идентификатор объектов определить порядок событий. 20.11.2013
  • Что мне нужно сделать, так это вернуться и изменить мой код, чтобы переименование/порядок вещей происходил только один раз, когда пользователь нажимает «Сохранить». Для этого мне также нужно вернуться назад и изменить способ добавления строк (чтобы каждая новая строка получала уникальный идентификатор, связывающий автозаполнение и скрытое поле вместе и т. д.). 20.11.2013
  • Можете ли вы опубликовать свой тег скрытого поля? 20.11.2013
  • Вы успешно переименовали все поля ввода? 20.11.2013
  • Переименование скрытых полей (и даже полей автозаполнения) работало нормально, это было связано с тем, что поле автозаполнения, хотя идентификатор был переименован, не меняло идентификатор, который он использовал/сохранял во время сценария автозаполнения (который генерируется автоматически от grails, см. последний фрагмент кода, который я вставил в свой исходный пост выше). Завтра я обязательно рассмотрю предложенное вами решение и посмотрю, сработает ли оно, ура! :) 21.11.2013
  • Почему вам нужно изменить «id»? Для отправки значений по порядку достаточно изменить имя. И вы можете обновить скрытое поле без идентификатора, см. мой отредактированный ответ (jQuery(tg._elTextbox).closest("tr.dummyClass").find("input[type=hidden]").val(id);). 21.11.2013
  • Ах... При сохранении я просматривал параметры в контроллере сохранения и выбирал оттуда что-то для сохранения. Я предположил, что это было значение идентификатора, которое я использовал, чтобы получить это, а не имя, мне нужно будет проверить, но если это имя, то я надеюсь, что смогу использовать это, и работа хорошая! :) Я дам вам знать, как только у меня будет возможность попробовать, спасибо! 21.11.2013
  • После относительно простого изменения не переименования идентификаторов, а только имен, проблема решена!! Не могу поверить, что это было так просто! Если вы хотите сделать это ответом, я с удовольствием отмечу это как ответ! :) 21.11.2013
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..