【问题标题】:how backbone fetch construct the model or collection?主干获取如何构建模型或集合?
【发布时间】:2012-11-12 00:38:07
【问题描述】:

在许多主干示例中,我看到了带有mymodel.fetch()mycollection.fetch() 的代码,并且大多数代码没有使用成功回调来从响应中构造模型/集合。我正在填写,就像我错过了有关 fetch 如何从结果中创建模型实例的信息。这是怎么发生的?

编辑

  1. 在某些情况下,模型与返回的 json 结构不同,需要映射模型属性。例如,模型属性是 'name' 和 'age' 但返回的 json 是:{n_name:'dan', props: {age: 12, address: '此数据不相关'}}。需要将返回的 json 映射到模型。我该怎么做?这种情况会迫使我使用成功回调吗?

  2. 有时模型包含与其他模型或集合的关系。例如,具有 AddressModel 类型的属性和名为 People 的人员集合的 HouseModel。我希望 fetch 在构造 AddressModel 时创建一个模型,并在构造 People 时创建一个人员集合。我该怎么做?我应该为此使用成功还是有其他方法/解决方法?

【问题讨论】:

    标签: javascript backbone.js fetch


    【解决方案1】:

    模型的实例已经“构建”好了。这就是你所说的fetch()

    否则,正在发生的情况是响应 JSON 被用于将每个键值对分配为该模型实例的属性。对于集合,它会根据响应创建新模型。

    所以本质上:

    // This line instantiates a new model
    var model = new MyApp.Models.ModelThing();
    // This line loads the model's attributes from the database
    model.fetch();
    

    如果您对这一切究竟是如何发生的感兴趣,请查看Backbone.sync 方法。这就是 AJAX 请求并触发处理响应的大多数回调的实际操作。

    可以传递给 fetch 的成功和错误回调纯粹是可选的,用于清除失败的加载或向用户发出加载发生的信号。

    【讨论】:

      【解决方案2】:

      这是您可能从中得到的一个示例。 我建议您从成功回调中操作并使用更新的模型 函数,因为这是异步方法,它可能是之后您可以实际使用模型的唯一方法。

      var MyModel = new Todo({id: Number(item)});
      MyModel.fetch({success:function(){
              var todo = new updateView({model: dModel });
              todo.render();  
      }});
      

      模型已经使用获取的数据构建,但在成功回调中使用该填充模型。

      已编辑:

      对于您的第一个问题:您需要查看 model.parse 或 collection.parse 的文档,以便您可以为后端响应自定义主干提取。这很容易做到:

      var Collection = Backbone.Collection.extend({
      
          parse: function(data){return data.objects;} 
      
      });
      

      对于你的另一个问题,我不太明白你想要做什么。 但我认为它应该非常简单。你可以用两种方式来做。 只是不要尝试在同一个函数中单独使用构造和获取的集合(在绑定事件和成功回调之外),因为由于异步获取,您可能一无所获。

      【讨论】:

      • 为此,您可以使用:model.on('change', yourFunc),然后每次模型更新时都会渲染视图。
      • 谢谢,我认为 parse 解决了我的两个问题。但也出现了另一个。如果 parse 负责解析数据,这意味着必须只有一个数据结构。例如,如果我有两个返回不同数据结构的 web 服务,并且都应该被提取到模型中,那么我该怎么做呢?
      • 您必须更具体地说明您要做什么。我建议您为此创建一个新问题。如果 parse 解决了您的问题,请接受答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-06
      相关资源
      最近更新 更多