WedX - журнал о программировании и компьютерных науках

отсоединить/добавить или показать/скрыть частичные фрагменты

Я обнаружил проблему, связанную с нокаутирующими привязками в HTML-частицах. У меня есть область контейнера на странице. Его содержимое предназначено для динамической замены в соответствии с логикой моего приложения. Для этого я использую технику отсоединения/добавления. Однако я заметил, что обновления не распространяются, когда элемент отсоединен. Мало того, в некоторых случаях привязки вообще теряются, а когда элемент прикрепляется обратно, обновление перестает работать.
Обновление данных важно в моем случае, потому что, хотя элемент может быть невидимым, он все равно может обновляться асинхронно.< br/> Я нашел потоки в stackoverflow, указывающие на ту же проблему. Однако однозначного ответа я не нашел. Были различные обходные пути, которые не выглядели привлекательными (например, использование закрытых методов нокаута). Единственный способ заставить все работать так, как задумано, — показать/скрыть частичные фрагменты вместо отсоединения/добавления.
Является ли такое поведение преднамеренным (я имею в виду дизайн нокаутной библиотеки)? Если это так, я бы не хотел обходить это, вводя различные обходные пути, которые потенциально могут привести к новым проблемам в будущем. Если нет, каков рекомендуемый шаблон использования для добавления/отсоединения в нокауте, чтобы он работал так же, как показ/скрытие (я бы предпочел использовать отсоединение/добавление, потому что основное приложение использует эту политику для всех своих контейнеров).

Вот ссылка jsbin для воспроизведения проблемы. Я также включил пример отображения/скрытия для сравнения: https://jsbin.com/iTIrigAp/3/edit?html,js,output

<h3>Attach/Detach</h3>

<p>issue 1: Detach/Update/Attach/Update</p>
<p>issue 2: Run with JS/Update/Enter new val/Detach/Update/Attach</p>

<div id="attdet">
    <input type="text" data-bind="value: a" />
    <input type="text" data-bind="value: b" />
</div>

<button id="detach">Detach</button>
<button id="update">Update</button>
<button id="attach">Attach</button>


function ViewModel() {
        this.a = ko.observable("a");
        this.b = ko.observable("b");

        this.c = ko.observable("c");
        this.d = ko.observable("d");     
    }

    var vm = new ViewModel();

    ko.applyBindings(vm, document.getElementById("attdet"));


    var nodes = null;

    $("#detach").click(function () {
        nodes = $("#attdet").children().detach();
    });

    $("#attach").click(function () {
        $("#attdet").append(nodes);
    });

    $("#update").click(function () {
        vm.a("att-det");
        vm.b("att-det");
    });
03.02.2014

Ответы:


1

Если вы просто скрываете и показываете узлы, используйте видимую привязку нокаута:

Привязка visible заставляет связанный элемент DOM становиться скрытым или видимым в соответствии со значением, которое вы передаете привязке.

или привязку CSS для привязки к нему значения true/false:

Привязка css добавляет или удаляет один или несколько именованных классов CSS к связанному элементу DOM. Это полезно, например, чтобы выделить какое-то значение красным цветом, если оно станет отрицательным.

или, возможно, самый простой способ — использовать события jQuery show/hide.

Ваша проблема в том, что detach буквально удаляет элементы из DOM. Хотя он хранит события и значения полей, Knockout не может распознавать параметры, и он будет переоценивать, когда вернется в DOM.

Показать/скрыть, с другой стороны, просто удаляет их с дисплея, что, кажется, является вашим фактическим намерением.

Источники:

03.02.2014
  • Если вы действительно хотите присоединить/отсоединить (например, чтобы избежать создания огромного DOM), вы можете использовать привязки if/ifnot, которые позволят Knockout добавлять/удалять разделы DOM, сохраняя при этом связанные значения. 04.02.2014
  • Новые материалы

    Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что это выглядит сложно…
    Просто начните и учитесь самостоятельно Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что он кажется мне сложным, и я бросил его. Это в основном инструмент..

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

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..


    Для любых предложений по сайту: [email protected]