Backbone.js 主干追加模型在控制台中工作,但在$(document.ready)之后不工作
我的最终目标是将JSON数据附加到Backbone.js 主干追加模型在控制台中工作,但在$(document.ready)之后不工作,backbone.js,fetch,backbone-views,document-ready,Backbone.js,Fetch,Backbone Views,Document Ready,我的最终目标是将JSON数据附加到ul#tweets,每个都作为单独的隐藏列表项。随着时间的推移,它们将一个接一个地显示在屏幕上,然后从ul#tweets列表中删除 一旦隐藏项的数量降到一定数量以下,我想重新附加JSON数据。当这种情况发生时,我不担心重复的项目 我试图通过创建一个带有超时的函数来设置一个测试,以便每隔5秒它将JSON数据附加到列表中 然而,尽管我的应用程序在pageload fine上加载初始数据,但当我创建一个要在$(document).ready({})中运行的函数时,它不
ul#tweets
,每个都作为单独的隐藏列表项。随着时间的推移,它们将一个接一个地显示在屏幕上,然后从ul#tweets
列表中删除
一旦隐藏项的数量降到一定数量以下,我想重新附加JSON数据。当这种情况发生时,我不担心重复的项目
我试图通过创建一个带有超时的函数来设置一个测试,以便每隔5秒它将JSON数据附加到列表中
然而,尽管我的应用程序在pageload fine上加载初始数据,但当我创建一个要在$(document).ready({})
中运行的函数时,它不会工作
但是,我知道,我可以在页面加载后在控制台中手动附加JSON数据(与下面的代码相同,无需将其包装到函数或doc.ready中)
谢谢你的帮助
功能:
$(document).ready(function(){
updateTweets = function() {
newTweets = new Tweets();
newTweets.fetch();
newTweets.each( function(tweet) {
console.log('test'); // this doesn't work
view = new TweetView({ model:tweet });
$('#tweets').append(view.render().el);
});
setTimeout(updateTweets, 5000);
};
updateTweets();
});
这是我的代码
// MODEL
window.Tweet = Backbone.Model.extend({});
// COLLECTION
window.Tweets = Backbone.Collection.extend({ model: Tweet, url: '/tweets' });
// SET GLOBAL VARIABLE FOR NEW TWEETS COLLECTION
window.tweetList = new Tweets();
$(document).ready(function() {
// MODEL VIEW
window.TweetView = Backbone.View.extend({
tagName: 'li',
className: 'tweet',
initialize: function() {
_.bindAll(this, 'render');
this.model.bind('change', this.render);
this.template = _.template($('#tweet-template').html());
},
render: function(){
var renderedTweets = this.template(this.model.toJSON());
$(this.el).html(renderedTweets);
return this;
}
});
// COLLECTION VIEW
window.TweetListView = Backbone.View.extend({
template: _.template($('#tweet-list-template').html()),
initialize: function() {
_.bindAll(this, 'render');
this.collection.bind('reset', this.render);
},
render: function() {
var $tweets,
collection = this.collection;
$(this.el).html(this.template({}));
$tweets = this.$('#tweets');
collection.each(function(tweet){
var view = new TweetView({
model: tweet,
collection: collection
});
$tweets.append(view.render().el);
});
return this;
}
});
// ROUTER
window.TweetListDisplay = Backbone.Router.extend({
routes: {
'': 'home'
},
initialize: function(){
this.tweetListView = new TweetListView({
collection: window.tweetList
});
},
home: function() {
var $container = $('#container');
$container.empty();
$container.append(this.tweetListView.render().el);
},
});
// DECLARE AND START APP
window.app = new TweetListDisplay();
Backbone.history.start();
}); // close $(document).ready({});
你不能打电话
newTweets.fetch();
然后立即开始处理该集合,就好像它可以使用一样。。这需要时间。。获取调用是异步的。。它在console中工作的原因是为console准备输出需要时间。。而且提取确实完成了
您应该为获取提供一个成功回调,如下所示:
newTweets.fetch({success: function(){//process collection}});
你不能打电话
newTweets.fetch();
然后立即开始处理该集合,就好像它可以使用一样。。这需要时间。。获取调用是异步的。。它在console中工作的原因是为console准备输出需要时间。。而且提取确实完成了
您应该为获取提供一个成功回调,如下所示:
newTweets.fetch({success: function(){//process collection}});
你打电话到这里来
newTweets.fetch();
然后在开始处理集合之后,就好像它已经被填充一样,在这里
newTweets.each( function(tweet) {
console.log('test'); // this doesn't work
view = new TweetView({ model:tweet });
$('#tweets').append(view.render().el);
});
fetch
是一个异步操作,这意味着在启动它之后,程序的其余部分将立即继续执行,无论fetch
启动的ajax调用是否返回。因此,当您开始处理集合时,您的获取尚未返回,集合仍然为空
有两种方法可以纠正这种情况。让我们首先创建一个函数processCollection
,该函数对集合执行您想要的操作:
var processCollection = function () {
newTweets.each( function(tweet) {
console.log('test'); // this doesn't work
view = new TweetView({ model:tweet });
$('#tweets').append(view.render().el);
});
};
1回调函数(我不喜欢这些)
现在,将在获取成功后立即调用processCollection
2绑定到事件(我更喜欢这个)
当提取成功返回时,它将填充集合并触发一个重置
-事件。这是连接处理事件的好地方,因为您知道现在已填充了集合。我还发现,事件的作用域问题比回调稍微少一些
希望这有帮助 您可以在这里调用fetch
newTweets.fetch();
然后在开始处理集合之后,就好像它已经被填充一样,在这里
newTweets.each( function(tweet) {
console.log('test'); // this doesn't work
view = new TweetView({ model:tweet });
$('#tweets').append(view.render().el);
});
fetch
是一个异步操作,这意味着在启动它之后,程序的其余部分将立即继续执行,无论fetch
启动的ajax调用是否返回。因此,当您开始处理集合时,您的获取尚未返回,集合仍然为空
有两种方法可以纠正这种情况。让我们首先创建一个函数processCollection
,该函数对集合执行您想要的操作:
var processCollection = function () {
newTweets.each( function(tweet) {
console.log('test'); // this doesn't work
view = new TweetView({ model:tweet });
$('#tweets').append(view.render().el);
});
};
1回调函数(我不喜欢这些)
现在,将在获取成功后立即调用processCollection
2绑定到事件(我更喜欢这个)
当提取成功返回时,它将填充集合并触发一个重置
-事件。这是连接处理事件的好地方,因为您知道现在已填充了集合。我还发现,事件的作用域问题比回调稍微少一些
希望这有帮助 太好了!非常感谢你们!它的工作就像一个魅力!精彩的!非常感谢你们!它的工作就像一个魅力!