我正在嘗試構(gòu)建一個(gè)包含多個(gè)列表的待辦事項(xiàng)列表.一切都很好.當(dāng)我想使用JQuery UI Sortable時(shí)會(huì)出現(xiàn)問題.
我在渲染函數(shù)中的TaskListView中添加了片段,但是我必須將它包裝到setTimeout函數(shù)中,以便等到DOM加載.
我很確定有更好的方法可以做到這一點(diǎn),但我還是找不到它.感謝幫助.
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'> </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'> </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;
}
});
解決方法:
而不是使用setTimeout,只需使用$(function(){})(或$(document).ready),就像通常等待DOM準(zhǔn)備好一樣.這些函數(shù)沒有什么特別之處,您可以隨時(shí)向它們添加新的回調(diào).所有你不必?fù)?dān)心的是在你的回調(diào)中保持這個(gè)含義.
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'> </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);
var self = this;
$(function(){
self.$('.tasks').sortable({
stop: function(e, ui) {
ui.item.trigger('drop', ui.item.index());
}
})
return this;
}
或者,(并且可能更正確)采取措施確保在DOM準(zhǔn)備好之前,您的骨干視圖沒有調(diào)用其render方法.
來源:https://www.icode9.com/content-1-251851.html