Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何生成模型id';s与Backbone.js一起使用_Backbone.js - Fatal编程技术网

如何生成模型id';s与Backbone.js一起使用

如何生成模型id';s与Backbone.js一起使用,backbone.js,Backbone.js,我正在设置主干同步机制,有点困惑在哪里为模型生成id 当我创建一个新模型时,主干网是否应该生成和设置id,或者我应该实现一个id生成方法,或者是否有某种机制将数据“放入”服务器,它生成id并返回id为的模型?我从您的问题中了解到,您希望有一个包含服务器上存在的模型的集合。为了将这些模型放入集合中,您必须在集合中添加调用'fetch()' url应该是“/users”或类似的东西,必须返回一个包含用户数据的对象数组。然后,数组中的每个项都将传递给UserCollection.add()。好吧,实际

我正在设置主干同步机制,有点困惑在哪里为模型生成id


当我创建一个新模型时,主干网是否应该生成和设置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)

数据通信流是这样发生的

  • 您可以创建一个模型
  • 该型号是新的,因此它只有一个cID-没有正确的ID
  • 保存模型
  • 模型的json表示将发送到服务器(POST)
  • 服务器将其保存到表中并为其提供资源id
  • 服务器发回数据{id:uniqueID}的json表示形式
  • 主干接收这个id为的json表示
  • 主干自动使用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
    
    // 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…)

    我不知道这对你来说是否太初级,但希望它能帮助遇到这个问题的其他人。