2013-03-22 11 views
10

Komponuję to w widoku, a następnie próbuję wywołać funkcję .datepicker() na wyniku, ale nic się nie dzieje.. Request wywołanie wewnątrz funkcji aktywacji Durandala nie działa

komponować pojemnik

<div> 
<!--ko compose: { model:'viewmodels/schedule', view: 'views/schedule.html', activate:true} --> 
<!--/ko--> 
</div> 

schedule.html

<div class="schedule-editor"> 

</div> 

i moduł harmonogram

define([], function() { 
    var vm = { 
     activate: activate, 
    }; 
    return vm; 

    function activate() { 
     $('.schedule-editor').datepicker(); 
     console.log("activated schedule module"); 
     return true; 
    } 
}); 

Conso le logs "aktywowany moduł harmonogramu", ale datepicker nie jest tworzony. Jeśli przejdę do konsoli chrome i uruchomię wywołanie jQuery, $('.schedule-editor').datepicker();, to pokaże datepicker dobrze.

Dokumenty Durandala twierdzą, że funkcja aktywacji jest wywoływana po pełnym składzie DOM, więc nie wiem, co jeszcze można spróbować.

+3

Spróbuj umieścić logikę jQuery w metodzie "viewAttached" zamiast metody "activate". – nemesv

Odpowiedz

11

Zamiast wspomnianego nemesv powinieneś użyć viewAttached.

define([], function() { 
    var vm = { 
     viewAttached: viewAttached, 
    }; 
    return vm; 

    function viewAttached(view) { 
     $(view).find('.schedule-editor').datepicker(); 
     console.log("activated schedule module"); 
     return true; 
    } 
}); 

Aktywuj dzieje się w cyklu, zanim model został powiązane z danymi do nowego widoku i przed widzenia został dodany do DOM. viewAttached dzieje się po tym, jak widok został powiązany z twoim modelem i dołączony do domingu.

EDIT

Durandal 2.0 został przemianowany viewAttached do attached

+0

Właśnie to przetestowałem, zadziałało po tym, jak zmieniłem jquery na pierwotne wywołanie, robiąc $ (view) .find nie działało. W przeciwnym razie działa teraz, dzięki chłopaki –

+0

Tylko przypomnieć - "viewAttached" został przemianowany na "załączony" w durandal 2.0, więc użyj tej nazwy zamiast tego dla tej wersji. –

5

jest inne podejście do tego, że pozostaje wierny filozofii deklaratywnej UI że knockout.js i Durandal dążą do.

Pozwoli to zadeklarować datepicker w HTML jak poniżej:

<div class="schedule-editor" data-bind=" 
    jqueryui: { 
     widget: 'datepicker', 
     options: { 
      // you can set options here as per the jquery ui datepicker docs 
     } 
    }"> 

</div> 

prostu włączyć jQuery UI powiązania widgetów znalezione w tym GIST: https://github.com/SteveSanderson/knockout/wiki/Bindings---jqueryui-widgets

Upewnij się, że to powyższy skrypt po załadowałeś jquery, jquery ui i nokaut.

+1

preferuje to poprzednie podejście, ponieważ utrzymuje maszynę w czystości. Jeśli chodzi o specyficzną obsługę ui, to chyba powinno to być niestandardowe wiązanie, którego nokaut jest zbyteczny? – ajeeshpu

Powiązane problemy