5

学习主干我正在创建一个类似 Twitter 的应用程序。所以你知道 Twitter 每 N 秒向服务器发送一个 GET 请求以检查新推文。如果有新推文,它会创建隐藏的li元素并显示带有“N 个新推文”的按钮。如果单击它,它会显示隐藏的li元素,显示新推文。但是当您添加新推文时,行为会有所不同:推文是可见的。您不必单击按钮即可查看它。

我已经为隐藏的推文制作了第一部分。对于发布新推文并直接显示它的部分,我认为通过创建新模型、调用 collection.create() 并触发正确的事件很容易,例如:

var newTweet = new Tweet();
newTweet.set( /* set the attributes here. Some attributes are missing, because they are calculated server side */ );

var created_tweet = this.collection.create( newTweet, { silent: true, wait: true } ); // I choose silent=true because the add event on my collection is in charge of adding the new hidden tweets when there are new ones on the server
this.collection.trigger("posted_new_tweet", created_tweet);

然后,我的收藏订阅了事件“posted_new_tweet”,因此每次用户发布新推文时,都会调用我收藏的特定方法。这种方法工作正常,直到由于触发器中传递的变量 created_comment 而出现错误:它不是“完整的”。我的意思是该模型具有一些未定义的属性,例如“id”或 *“created_on”*。这些属性是在服务器端计算的,但我认为如果我通过wait=true,它会等待并使用服务器给出的响应更新我的模型(当向服务器发出POST请求时,它会返回新创建的模型json)

我的模型不应该也具有服务器端属性吗?这是处理这种事情的正确方法吗?如果不是,我怎样才能有两种不同的方法来显示集合视图?

谢谢!

4

1 回答 1

14

create即使你通过了,它仍然是异步的{ wait: true }。不同之处在于,没有wait模型将立即添加到集合中,而使用wait骨干网在服务器成功响应之前不会将其添加到集合中。

您应该做的是添加一个成功回调,以create在服务器响应时触发事件。

var created_tweet = this.collection.create( newTweet, { silent: true, wait: true, success: this.successCallback } );

// Add successCallback as a method to the collection
successCallback: function(collection, response) {
  // I'm not 100% positive which values are passed to this function. Collection may actually be the new model.
  this.collection.trigger("posted_new_tweet", created_tweet);
}
于 2012-04-06T18:33:08.987 回答