2013-03-22 8 views
10

Ich komponiere dies in einer Ansicht, dann versuchen, .datepicker() auf das Ergebnis, aber nichts passiert..datepicker Aufruf innerhalb von Durandal aktivieren Funktion funktioniert nicht

Der compose Behälter

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

schedule.html

<div class="schedule-editor"> 

</div> 

Und der Zeitplan Modul

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

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

Conso le protokolliert "aktiviertes Zeitplanmodul", aber der Datapicker wird nicht erstellt. Wenn ich auf die Chrom-Konsole gehe und den jQuery-Anruf starte, $('.schedule-editor').datepicker();, bringt es den Datepicker in Ordnung.

Die Durandal-Dokumentation behauptet, dass die Aktivierungsfunktion aufgerufen wird, nachdem das DOM vollständig zusammengesetzt ist, also weiß ich nicht, was ich sonst noch versuchen soll.

+3

Versuchen Sie, Ihre jQuery-Logik in eine 'viewAttached'-Methode anstelle der' activate'-Methode einzufügen. – nemesv

Antwort

11

Wie Nemesv erwähnt, sollten Sie stattdessen viewAttached verwenden.

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

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

Aktivieren geschieht im Lebenszyklus, bevor Ihr Modell hat dagetenbundenen auf die neue Ansicht und vor dem Blick auf den Dom hinzugefügt wurde. viewAttached geschieht, nachdem die Ansicht datengebunden an Ihr Modell gebunden und an das Dom angehängt wurde.

EDIT

Durandal 2.0 viewAttached-attached

+0

Ich habe gerade getestet, dass es funktionierte, nachdem ich die jQuery auf den ursprünglichen Aufruf geändert hatte und dabei $ (view) .find nicht funktionierte. Ansonsten, funktioniert jetzt, danke Jungs –

+0

Nur daran zu erinnern - "viewAttached" wurde in "Durandal 2.0" umbenannt, also verwenden Sie diesen Namen stattdessen für diese Version. –

5

Es gibt einen anderen Ansatz dazu umbenannt hat, die auf die deklarative UI-Philosophie treu bleibt, die knockout.js und durandal erstrebenswert sind.

Es ermöglichen Ihnen, die picker im HTML wie folgt zu erklären:

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

</div> 

einfach die jQuery UI-Widget-Bindungen in diesem Kern gefunden sind: https://github.com/SteveSanderson/knockout/wiki/Bindings---jqueryui-widgets

Stellen Sie sicher, dass die oben Javascript sind nach du hast jquery, jquery ui und knockout geladen.

+1

bevorzugen dies dem vorherigen Ansatz, da es die VM sauber hält. Für eine spezifische Handhabung denke ich, dass es eine benutzerdefinierte Bindung sein sollte, die auch Knockout befürwortet? – ajeeshpu

Verwandte Themen