Backbone.js DOM ist nicht bereit in der render-Methode anwenden jquery-Magie

Ich versuche zu bauen, eine todo-Liste mit mehreren Listen. Funktioniert auch alles tadellos in Ordnung. Das Problem kommt, wenn ich möchte die JQuery-UI-Sortable.
Ich bin hinzufügen, das snippet in meinem TaskListView in der render-Funktion, aber das musste ich wickeln Sie es in eine setTimeout-Funktion, so dass es wartet, bis das DOM geladen ist.

Ich bin mir ziemlich sicher, dass es einen besseren Weg, dies zu tun, aber ich konnte einfach nicht finden, es noch. Hilfe ist willkommen.

var TaskView = Backbone.View.extend({
    initialize: function(task) {
        this.task = task;
    },
    render: function() {
        var completedClass = "completedTask";
        if (this.task.completed == 100) completedClass = "pendingTask";
        var html = ""
        + "<li class='task-<%= task.get('id') %> ' data-id='<%= task.get('id') %>' sortable='true'>"
        + "<div class='float-left'><i class='icon-trash removeTask' data-id='<%= task.get('id') %>'></i></div>"
        + "<div class='float-left'>"
        + "<span class='editTask ' data-type='title' data-id='<%= task.get('id') %>'><%= task.get('title') %></span> "
        + "</div>"
        + "<div class='float-right'>"
        + "<span class='editTask task-responsible label' data-type='responsible' data-id='<%= task.get('id') %>'><%= task.get('responsible') %></span>"
        + "<span class='editTask task-deadline label' data-type='ended' data-id='<%= task.get('id') %>'><%= task.get('ended') %></span>"
        + "<span class='label criticallyLevelToggle editTask <%= criticallyLevelClass %>' data-type='completed' data-id='<%= task.get('id') %>'><%= parseInt(task.get('completed')) %>%</span>"
        + "</div>"
        + "<div class='clear'>&nbsp;</div>"
        +"</li>";

        var template = _.template( html, {task: this.task, criticallyLevelClass:this.task.getCriticallyLevelClass(), completed: completedClass});
        this.$el.html(template);
        return this;
    }
});

var TaskListView = Backbone.View.extend({
    initialize: function(tasks) {
        this.tasks = tasks;
    },
    render: function() {
        var html = ""
        +"<ul class='tasks'>"
        +"<%= tasksli %>"
        +"<li><div class='float-left'><input type='text' placeholder='New task...' class='new-task' name='new-task'/></div><div class='clear'>&nbsp;</div></li>"
        +"</ul>";
        + "";
        var tasksRendered = "";
        if (_.isArray(this.tasks)) {
            for (var i = 0; i < this.tasks.length; i++) {
                var tView = new TaskView(new Task(this.tasks[i]));
                tasksRendered += tView.render().el.innerHTML;
            };
        }
        var template = _.template(html, { tasksli: tasksRendered});
        this.$el.html(template);

        setTimeout(function(){this.$('.tasks').sortable({
            stop: function(e, ui) {
                ui.item.trigger('drop', ui.item.index());
            }
        });}, 500);

        return this;
    }
});
  • Sie möchten möglicherweise verwenden Sie $(document).ready(function() { //your code here }); um dieses problem zu lösen
  • Unabhängigen Tipp: Anstelle von verketten Sie Ihre HTML-innen Ihre JS-Sie können fügen Sie diese zu Ihrem HTML-Code: <script type="text/template" id="mein-template"> [insert html-code] </script>. In Ihrem javascript verwenden: template:_.Vorlage($('#mein-template').html())
  • Hazaart: Danke... ich werde schauen das an. Würde alles ein bisschen mehr lesbar 😉
InformationsquelleAutor rapsli | 2013-06-13
Schreibe einen Kommentar