В модели представления Durandal представление не всегда прикрепляется при вызове viewAttached().

У меня есть ViewModel в Durandal с функцией viewAttached().

Согласно документам, это должно вызываться после того, как представление прикреплен к ДОМу.

В моей функции у меня есть селектор jQuery для элемента в прикрепляемом представлении:

function viewAttached() {
    console.log( $("#myViewId").length );
}

В большинстве случаев я правильно печатаю «1» на консоли, но, может быть, в 10% случаев я получаю 0. Представление еще не привязано к DOM.

У кого-нибудь еще возникла такая проблема?


person CodingWithSpike    schedule 09.05.2013    source источник


Ответы (2)


viewAttached получает созданное поддерево DOM, переданное в качестве аргумента.

Таким образом, вы можете либо изменить код на что-то в строке

function viewAttached(view) {
    console.log( $(view).length );
}

если вы хотите обернуть все представление с помощью jQuery или

function viewAttached(view) {
    console.log( $(view).find('mySubSelector').length );
}

если вам нужно работать с некоторыми конкретными элементами поддерева.

person RainerAtSpirit    schedule 09.05.2013
comment
Да, это именно то, что я в итоге сделал. К счастью, я смог, так как код был моим собственным, но есть некоторые другие библиотеки jQuery, которые внутренне используют $(...) для выполнения каких-либо действий, всегда предполагая, что ваши элементы будут в основном DOM. Непоследовательность этого - то, что действительно испортило меня. Если бы он всегда был включен или всегда выключен из DOM, по крайней мере, он был бы последовательным :) - person CodingWithSpike; 09.05.2013
comment
Итак, ваш родитель уже находится в DOM, когда вы пытаетесь получить к нему доступ? Согласно документу: это позволяет контроллеру или презентатору иметь прямой доступ к поддереву dom, к которому он привязан, в определенный момент времени после того, как он был введен в его родителя. - person RainerAtSpirit; 09.05.2013

Есть несколько замечаний:

  1. viewAttached срабатывает после того, как представление текущего модуля присоединено к его прямому родителю, что НЕ обязательно, когда оно прикреплено к DOM. В некоторых случаях это очевидное ограничение. Для Durandal 2.0 мы добавляем дополнительный обратный вызов с именем documentAttached, который срабатывает, когда все прикреплено к dom страницы.

  2. viewAttached передается представление для текущего модуля. Вы должны использовать это для предоставления контекста любому коду jQuery, который вы пишете.

person EisenbergEffect    schedule 11.06.2013