2014-01-16 9 views
0

В настоящее время я использую фреймворк Durandal для создания простого сайта (мой первый с Durandal) и вопрос о том, как добавить простую функцию javascript. Я хочу вызвать функцию после загрузки DOM, но я не уверен, как ее привязать к текущей модели viewmodel. Проблема, с которой я столкнулась, заключается в том, что функция вызывается перед загрузкой DOM и идентификатор div еще не создан, что в данном случае является «sb-search».Как добавить пользовательскую функцию javascript в Durandal

Затем я попытался добавить функцию к ViewModel:

define(["plugins/router"], function (router) { 

var vm = { 
     viewAttached: viewAttached 
    }; 

    return { 
     router: router 
    }; 

    function attached() { 
     new UISearch(document.getElementById('sb-search')); 
    } 

    return vm; 

}); 

, но безрезультатно.

Любая помощь была бы принята с благодарностью. Даже простой учебник о том, как «document.write (« Hello World »), будет полезен. Благодаря!

+1

Ваша функция и объект, который вы используете, чтобы показать его, не совпадают. –

+0

Да, отредактируйте {viewAttached: viewAttached} в {viewAttached: attach} –

+0

@JamieHammond Хотя очень вероятно, что он действительно означает определить обработчик Durandal 'attach', поэтому @Craiger, сделайте это' vm = {attach: attach} ' , – tne

ответ

1

Это не связано строго, но я хотел бы добавить что-то к сказанному в комментариях: вы, скорее всего, не должны сканировать глобальный документ в обработчике attached. Когда это называется, скомпонованные представления могут не быть, ну, сами составлены/присоединены, и в целом неплохо не делать предположений о глобальном состоянии. Кроме того, вы можете получить производительность, не сканируя всю DOM.

При звонке attached, Durandal passes the root DOM element of the view bound to the view model as the first argument to the function. Используйте его для ограничения поиска. Если он находится в детском/скомпонованном виде, используйте обработчик compositionComplete, который называется после завершения композиции (событие «пузырится»). Если он находится в родительском представлении, используйте второй аргумент, переданный этим функциям. Если это действительно звучит слишком сложно, подумайте, что ваш дизайн мог бы сам себя испортить, ищите руководство MVVM.

Для полноты:

Комментарии отметить, что

  • Вы должны экспортировать правильную функцию,
  • Если вы действительно предназначены для определения attached обработчик вызывается (attached = viewAttached!) Durandal, знайте, что viewAttached устарел в пользу attached.
  • И я также добавлю, что вы возвращаете анонимный объект, содержащий свойство router, прежде чем вы вернете vm (конечно, посмотрите модель), хотя это может быть перечеркнуто из некоторых тестов, которые вы выполнили и скопировали здесь ошибка.
Смежные вопросы