如何生成模型id';s与Backbone.js一起使用
我正在设置主干同步机制,有点困惑在哪里为模型生成id如何生成模型id';s与Backbone.js一起使用,backbone.js,Backbone.js,我正在设置主干同步机制,有点困惑在哪里为模型生成id 当我创建一个新模型时,主干网是否应该生成和设置id,或者我应该实现一个id生成方法,或者是否有某种机制将数据“放入”服务器,它生成id并返回id为的模型?我从您的问题中了解到,您希望有一个包含服务器上存在的模型的集合。为了将这些模型放入集合中,您必须在集合中添加调用'fetch()' url应该是“/users”或类似的东西,必须返回一个包含用户数据的对象数组。然后,数组中的每个项都将传递给UserCollection.add()。好吧,实际
当我创建一个新模型时,主干网是否应该生成和设置id,或者我应该实现一个id生成方法,或者是否有某种机制将数据“放入”服务器,它生成id并返回id为的模型?我从您的问题中了解到,您希望有一个包含服务器上存在的模型的集合。为了将这些模型放入集合中,您必须在集合中添加调用'fetch()' url应该是“/users”或类似的东西,必须返回一个包含用户数据的对象数组。然后,数组中的每个项都将传递给UserCollection.add()。好吧,实际上它会一下子通过,但你明白了 在此之后,将填充您的集合。模型上的url用于更新和保存单个模型。集合的url也将用于创建模型。主干网的同步是RESTful的,就像RubyonRails一样。您可以在Ruby on Rails的文档中了解更多信息: 您通常会为您的模型和控制器提供不同的url。填充集合后,每个模型都有id,因为它们来自服务器 现在,当您根据用户输入添加新模型时,您将执行以下操作:
var HomeModel = Backbone.Model.extend({
defaults: {
lead: "not logged in",
},
url: 'test.php',
initialize: function(){
_.bindAll(this, 'handleSave', 'handleError');
// Save already knows if this.isNew.
this.save(undefined, {success: this.handleSave, error: this.handleError});
},
handleSave: function(model, response){
this.model.reset(model);
},
handleError: function(){
},
});
var HomeView = Backbone.View.extend({
initialize: function() {
_.bindAll(this, 'render');
this.model = new HomeModel();
this.model.bind("change", this.render);
},
el: 'div',
render: function() {
// Do things to render...
}
});
var homeView = new HomeView();
这个例子来自我回答的其他人的问题,我只是添加了相关的内容
一般的想法是在创建模型时保存它,如果您在其他地方需要它,您可以将代码移动到模型的函数中,并基于事件或其他任何东西调用该函数
或者是否存在某种机制,我将数据“放入”服务器,服务器生成id并返回带有id的模型
有点。当您调用模型的save方法时,会生成一个POST-XHR,您的应用程序服务器应该使用包含id的JSON进行响应。
您可以在此处看到一个示例:
引用链接:
post '/api/:thing' do
# parse the post body of the content being posted, convert to a string, insert into
# the collection #thing and return the ObjectId as a string for reference
oid = DB.collection(params[:thing]).insert(JSON.parse(request.body.read.tos))
"{\"id\": \"#{oid.to_s}\"}"
end
如果您不知道Ruby,请记住该方法自动返回的最后一个表达式是什么。我提供了第二个答案,以简化您需要学习的代码,从而获得您正在思考的要点—从模型到服务器的实际循环以及ID如何发挥作用 假设你定义了一个模型——让我们来看看侏罗纪公园
// Define your model
var Dinosaur = Backbone.Model.extend({
defaults: {
cavemanEater: undefined // Has one property, nom nom or not.
},
urlRoot: 'dino' // This urlRoot is where model can be saved or retrieved
});
var tRex = new Dinosaur({'cavemanEater':true});
您现在已经实例化了一种食肉恐龙。吼叫
console.log(tRex);
您应该注意的是,在tRex的属性中,您的模型没有id。相反,您将看到一个cID,您可以将其视为主干自动分配给模型的临时id。当模型没有id时,它被认为是新的。持久化模型(数据库或本地存储)的概念允许您在创建该资源后返回该资源,并执行诸如保存(PUT)或销毁(DELETE)之类的操作。如果您无法再次直接指向该资源,则很难找到该资源!为了找到该资源,您的模型需要一个id,这是它当前没有的
因此,正如上面的答案所解释的,为主干网提供资源id是数据库(或localstorage,或其他解决方案)的工作。大多数情况下,这来自资源id本身,也就是某个表中模型的主键id
在我的设置中,我使用PHP和mySQL。我将有一个名为恐龙的表格,每一行都是我的恐龙模型的持久表示。所以我有一个id列(唯一的自动递增int)和cavemanEater(bool)
数据通信流是这样发生的
tRex.save();
// {'cavemanEater':true} is sent to my server
// It uses the urlRoot 'dino' as the URL to send. e.g. http://www.example.com/dino
// If successful, receives this json with id and updates your model.
服务器:
// Is setup to accept POST requests on this specific ROUTE '/dino'
// Server parses the json into something it can work with, e.g. an associative array
// Server saves the data to the database. Our data has a new primary id of 1.
// Data is now persisted, and we use this state to get the new id of this dino.
$dinoArray = array('id'=>1, 'cavemanEater'=>true);
$dinoJSON = json_encode($dinoArray);
// Server does something to send $dinoJSON back.
客户:
tRex.save();
// {'cavemanEater':true} is sent to my server
// It uses the urlRoot 'dino' as the URL to send. e.g. http://www.example.com/dino
// If successful, receives this json with id and updates your model.
现在您的tRex的id=1。或者我应该说
tRex.toJSON();
// RETURNS {'id':'1', 'cavemanEater':'true'}
祝贺你。如果执行此操作,tRex.isNew()
将返回false
主干是智能的。它知道发布新模型并放置已经有资源id的模型
下次执行此操作时:
tRex.save();
主干将向以下URL发出PUT请求
顺便说一下,这是默认行为。但您会注意到URL与save不同。在服务器上,您需要一个接受/dino/:id而不是/dino的路由
默认情况下,它将为您的模型使用/urlRoot/:id路由模式,除非您对其进行其他调整
不幸的是,恐龙已经灭绝了
tRex.destroy();
这将调用。。。你能猜到吗?是的。删除对/dino/1的请求
您的服务器必须区分对不同路由的不同请求,以便主干网正常工作。有几种服务器端技术可以做到这一点
如果你使用Ruby,有人提到Sinatra。就像我说的,我使用PHP,我使用SLIM PHP框架。它的灵感来自西纳特拉,所以它很相似,我喜欢它。作者编写了一些干净的代码。但是,这些RESTful服务器实现的工作方式超出了本文讨论的范围
我认为这是新主干网数据的基本全过程,没有id,通过Internet到您的服务器生成,并发送回资源id,使您的模型从此过上幸福的生活。(或destroy()
not…)
我不知道这对你来说是否太初级,但希望它能帮助遇到这个问题的其他人。