2011-10-17 63 views
4

一般问题,如果我正在调用一个web服务来返回与我的一个骨干模型相关的数据。从模型本身中调用Web服务会更好吗,还是应该在初始化时将WS的结果传递给模型?Backbone.js模型数据检索

我倾向于将WS调用并入我的模型中,但显然可能会遇到延迟问题。

那么,哪里是处理这种数据检索的最佳地点?

回答

4

如果呈现HTML的页面已经知道要进入模型的数据,那么我绝对倾向于将数据直接渲染到模型构造器中。就像这样(假设Rails视图,但这只是为了说明):

假设您的控制器已经呈现了一些JSON数据,如@modelData

var modelData = <%= @modelData %>; 
var model = new TheModel(modelData); 

这样做可以让您立即获得数据并且不需要第二次回拨服务。我多次使用这种方法取得了很大的成功。

编辑

要在此展开,这将导致更少的服务器调用,因为后端呈现在被返回给客户端的HTML或JS的数据。上面的代码的结果(后视图渲染)可能是这样的:

var modelData = {id: 5, first: "Collin", last: "Estes" }; // populated in first server call 
var model = new TheModel(); 

如果你给它的另一种方式,但是,你做两次调用服务器:

var model = new TheModel({id: 5}); 
model.fetch(); // results in second server call 

的首先调用服务器是返回你的代码的人。第二种情况发生在您调用fetch时。

如果您有其他要求,请致歉。你可能会澄清你的意思是“哪里是处理这些电话的最佳地点”。

+1

+1这是设置JS模型初始值的方法。 - 对服务器的呼叫越少,意味着用户的网页速度越快。请记住,您可以(在视图中)以JSON的形式输出,以便在JS中分配复杂的数据结构。 –

+0

我不确定我关注。为什么这会减少对服务器的调用?我将不得不向我的服务器拨打相同数量的电话,我只想知道处理这些呼叫的最佳位置在哪里。我想布赖恩你说我应该在我的模型实例化之前处理它们,并且用构造函数传入所有必要的数据? –

+0

@CollinEstes我扩大了我的答案,解释了为什么会导致更少的服务器调用。不过,我可能会误解你的问题。 –

1

正确的做法是先创建模型,然后使用model.fetch来提取数据。这样,你所有的ajax逻辑合并到Backbone.sync

如果您在渲染HTML时已有数据,我会将其放入缓存中,例如sessionStorage,并让您的同步代码可以读取/写入缓存。这样,如果您需要将Web服务调用移出HTML呈现(例如,如果您使用的是应用程序缓存),则无需进行重大重构。