如何生成与Backbone.js的型号标识(How to generate model id'

2019-07-29 14:28发布

我设立的骨干同步机制,有点糊涂,其中生成的ID为模特。

当我创建一个新的模式,应该骨干来生成并设定的ID,或者我应该实现一个ID生成方法,或者是有某种机制在哪里“PUT”数据到服务器,该服务器产生的ID和返回与ID的模式?

Answer 1:

或者是有某种机制在哪里“PUT”数据到服务器,该服务器产生的ID,并返回一个模式与ID?

的种类。 当你打电话给你的模型的保存方法,骨干进行POST XHR和应用程序服务器使用JSON包含一个ID应该响应。 :你可以在这里看到一个例子http://addyosmani.com/blog/building-backbone-js-apps-with-ruby-sinatra-mongodb-and-haml/

从链接引用:

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

如果你不知道红宝石记住什么是最后计算的表达式自动由该方法返回。



Answer 2:

我提供一个第二个答案来简化你需要学习让你琢磨一下要点码 - 大约从模型到服务器,以及如何IDS实际一轮发挥他们的作用。

假设你定义模型 - 让我们一起去侏罗纪公园。

// 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。 相反,你会看到,你能想到的作为临时的ID骨干自动分配给你的模型的CID。 如果模型没有一个ID它被认为是新的。 坚持一个模型(数据库或本地存储)的概念是什么让你回到那个资源时创建完成后,和不喜欢的东西保存(PUT)或销毁(删除)。 这将是很难找到的资源,如果你有没有办法在它再次直接指向! 为了找到这个资源,你的模型需要一个ID,它的东西目前还没有。

因此,作为上述答案已经解释它是你的数据库(或本地存储,或者一些其他的解决方案),提供骨干与资源ID的工作。 大多数时候,这个来自资源ID本身,又名 - 在某些表格模型的主键ID。

随着我的设置,我使用PHP和MySQL。 我有一个表称为恐龙和各行会是我的恐龙模型的持久性表示。 所以我有一个ID列(独特的自动递增INT),和cavemanEater(布尔)。

的数据通信流发生这样的。

  1. 您创建一个模型。
  2. 该模型是新,所以它只有一个CID - 没有合适的ID。
  3. 您保存模型。
  4. 模型的JSON表示形式发送到您的服务器(POST)
  5. 您的服务器将其保存到表,并给它一个资源ID。
  6. 你的服务器发送数据的JSON表示{ID:UNIQUEID}
  7. 骨干接收到带有ID这JSON表示
  8. 骨干自动的与ID更新您的模型。

下面是注释的代码看起来像。

客户:

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

服务器:

// 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.

客户:

// If successful, receives this json with id and updates your model.

现在你的Trex公司有一个id = 1,或者我应该说...

tRex.toJSON();
// RETURNS {'id':'1', 'cavemanEater':'true'}

恭喜。 如果你这样做tRex.isNew()将返回false。

骨干是聪明的。 它知道要张贴新的模式和PUT已经有一个资源ID车型。

下一次你这样做:

tRex.save();

骨干将使PUT请求发送到以下网址。

http://www.example.com/dino/1

这是顺便默认行为。 但你会注意到的是,网址超过保存不同的。 在服务器上,你需要接受/恐龙/路线:ID,而不是/恐龙

除非你调整它,否则你的模型ID路由模式默认为:它将使用/ urlRoot /。

不幸的是,恐龙灭绝。

tRex.destroy();

这将调用...你能猜得到吗? 是的。 DELETE请求/恐龙/ 1。

您的服务器必须为了使骨干工作不同要求不同的路线进行区分。 有几个服务器端的技术,可以做到这一点。

如果你正在使用Ruby有人提到西纳特拉。 就像我说的,我用PHP和我使用SLIM PHP框架。 它是由西纳特拉所以它的灵感来自相似,我喜欢它。 笔者写一些干净的代码。 这些基于REST的服务器实现工作这是怎么讨论的范围之内,但。

我认为这是新的骨干数据没有ID的基本全行程,在整个网络上实现你的服务器在那里产生,并发送回资源​​ID,使你的模型从此过上幸福生活。 (或destroy()不...)

我不知道这是不是太初级了你,但希望这会帮助别人谁运行到这个问题。 骨干网是真的乐趣编程。

其他类似的答案: 如何拯救骨干JS模型数据



Answer 3:

我从你的问题不解的是,你想有一个与服务器上存在的模型的集合。 为了得到这些模型进入收集你必须添加呼叫“取()”的集合。

该网址将是“/用户”或类似的东西,那会在那里与用户数据返回对象的数组。 阵列中的每个项目将被传递给UserCollection.add()。 嗯,实际上这将全部通过一次,但你明白了吧。

在这之后您的收藏填充。 模型上的网址是为更新和保存单个模型。 该集的URL也将被用于创建模型。 骨干网的同步是基于REST的,像Ruby on Rails的。 实际上,你可以了解更多有关它的Ruby on Rails的的文件上:

http://guides.rubyonrails.org/routing.html

你通常会做的是对你的模型比你的控制器不同的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();

这个例子是从别人的问题,我回答,我只是添加相关的东西。

总的想法是保存模型创建时,如果你需要它在其他地方你可以移动代码到模型的函数,调用基于事件或其他任何东西。



文章来源: How to generate model id's with Backbone.js
标签: backbone.js