2012-05-17 67 views
1

我正在使用下面的代码来加载两个underscore.js模板。点击第一个链接后,加载框架模板。第一个触发器执行find bind,它正确地执行loadBookmarks函数,但'loaded'触发器永远不会触发并且loadFriendBookmarks永远不会执行。为什么是这样?是否有另一种方法来实现这一点?为什么jQuery的这些嵌套触发器不起作用?

$('#bookmarks-link').click(function() { 
    $('#bookmarks-count').text("0"); 
    var skeleton = modalTemplate(); 
    $('#bookmarks').append(skeleton); 
    $('#bookmarks').trigger('skeleton'); 
}); 

$('#bookmarks').bind('skeleton', function() { 
    $('#bookmarks .thumbnails').loadBookmarks(getBookmarksUrl(1)); 
    // If I add an alert('hi') here, it works perfectly. 
    $('#bookmarks').trigger('loaded'); 
}); 

$('#bookmarks').bind('loaded', function() { 
    $('#bookmarks .thumbnails a').each(function() { 
    $(this).bind('click', function() { 
     $('#bookmarks .bookmarks-table tbody').empty(); 
     $('#bookmarks .bookmarks-table tbody').loadFriendBookmarks(
     getFriendBookmarksUrl($(this).attr('data-item')) 
    ); 
    }); 
    }); 
}); 

所以足够有趣,触发器都正常工作:如果我在loadBookmarks和触发之间坚持一个警告,一切工作正常。如果我把它拿出来,那么它不会。任何想法为什么?

回答

2

工作,这听起来像来自远程源loadBookmarks()加载数据,如Ajax调用。这意味着trigger('loaded')可以在之前触发loadBookmarks()已收到数据。您可以添加一个回调参数loadBookmarks()和有触发事件:

$('#bookmarks .thumbnails').loadBookmarks(getBookmarksUrl(1) , function() { 
    $('#bookmarks').trigger('loaded'); 
}); 

但是这需要你loadBookmarks知道它接收到的数据,并创建所需的HTML后调用此函数 - 不,我不能证明这一点看到loadBookmarks中的实际代码。


其它建议:不绑定处理这种方式,使用event delegation代替:

$('#bookmarks').on('click', '.thumbnails a', function(e) { 
    e.preventDefault(); // don't want the link to actually be followed, do we 
    var url = getFriendBookmarksUrl($(this).attr('data-item')); 
    if(url) { // in case it's clicked before the data attribute is set 
    var $tbody = $('#bookmarks .bookmarks-table tbody'); 
    $tbody.empty(); 
    $tbody.loadFriendBookmarks(url); 
    } 
}); 

这意味着所有元素选择匹配“#bookmarks .thumbnails一个”会调用这个点击处理程序,即使它们被添加到文件之后您称为on。这意味着即使在致电loadBookmarks之前,您也可以委派这些活动,完全不需要loaded活动。另外,这样你只有一个处理函数的副本在内存中,而不是你的bind,它为每个a节点创建了一个单独的函数副本。

+0

这正是我所期待的!非常感谢! – ArKi

0

问题是在你的代码中的其他地方。可能在loadBookmarks*函数中有些js错误。

看到:根据您的描述和常识

http://jsfiddle.net/BBESV/

触发完美

+0

足够有趣的是,触发器可以正常工作。如果我在loadBookmarks和trigger之间插入一个警报,一切正常。如果我把它拿出来,那么它不会。任何想法为什么? – ArKi

+0

声音像alert()正在创建一个延迟,'.loadBookmarks()'完成加载数据。 – DCoder

相关问题