【问题标题】:backbone.js set in model initialize not effecting models in collection在模型初始化中设置的主干.js 不影响集合中的模型
【发布时间】:2015-08-02 18:48:39
【问题描述】:

在对我的主干集合执行 fetch() 并将模型实例化为该集合的子节点时,我想向每个模型添加更多信息。

我认为我可以在模型初始化中使用 set 来做到这一点。 (我的假设是 fetch() 正在为传递给它的每个对象实例化一个新模型。因此,随着每次初始化发生,将设置额外的数据。

为了说明我的问题,我粘贴了四个 sn-ps,首先来自我的集合类。其次是我的模型类中的初始化函数。第三,我在初始化函数中使用的两个函数,用于从 flickr api 获取所需信息。第四,也是最后,执行fetch() 的app.js。

首先是集合类:

var ArmorApp = ArmorApp || {};
ArmorApp.ArmorCollection = Backbone.Collection.extend({
    model: ArmorApp.singleArmor,
    url: "https://spreadsheets.google.com/feeds/list/1SjHIBLTFb1XrlrpHxZ4SLE9lEJf4NyDVnKnbVejlL4w/1/public/values?alt=json",
  //comparator: "Century",
  parse: function(data){
    var armorarray = [];
    var entryarray = data.feed.entry;
    for (var x in entryarray){
        armorarray.push({"id": entryarray[x].gsx$id.$t,
                          "Filename": entryarray[x].gsx$filename.$t, 
                          "Century": entryarray[x].gsx$century.$t,
                          "Date": entryarray[x].gsx$date.$t,
                          "Country": entryarray[x].gsx$country.$t,
                          "City": entryarray[x].gsx$city.$t,
                          "Type": entryarray[x].gsx$type.$t,
                          "Maker": entryarray[x].gsx$maker.$t,
                          "Recepient": entryarray[x].gsx$recipient.$t,
                          "Flickrid": entryarray[x].gsx$flickrid.$t,
                          "FlickrUrl": "", //entryarray[x].gsx$flickrurl.$t,
                          "FlickrUrlBig": ""//entryarray[x].gsx$flickrurlbig.$t,
                        });
      }
      return armorarray;
  }
});

第二,我的模型中的初始化。

initialize: function(){
        //console.log("A model instance named " + this.get("Filename"));
        item = this;
        var flickrapi = "https://api.flickr.com/services/rest/?&method=flickr.photos.getSizes&api_key=<my_apikey>&photo_id=" + this.get("Flickrid") + "&format=json&jsoncallback=?"; 
        sources = getFlickrSources(flickrapi);
        sources.then(function(data){
            sourceArray = parseFlickrResponse(data);
            FlickrSmall = sourceArray[0].FlickrSmall;
            console.log (FlickrSmall);

            item.set("FlickrUrl", FlickrSmall);
            console.log(item);
        });

请注意我如何获取“Flickrid”并使用它来获取更多信息,然后尝试使用 item.set("FlickrUrl", FlickerSmall); 将其添加回模型中

console.log 确认属性“FlickrUrl”已设置为所需的值。

第三,这些是我的模型用来获取闪烁 api 所需信息的函数。

var getFlickrSources = function(flickrapi){
  flickrResponse = $.ajax({
      url: flickrapi,
      // The name of the callback parameter, as specified by the YQL service
      jsonp: "callback",
      // Tell jQuery we're expecting JSONP
      dataType: "jsonp"})

  return flickrResponse;
}

var parseFlickrResponse = function(data){
  flickrSourceArray = []

  if (data.stat == "ok"){
    sizeArray = data.sizes.size;
    for (var y in sizeArray){
      if (sizeArray[y].label == "Small"){
        flickrSourceArray.push({"FlickrSmall": sizeArray[y].source});
      }
      else if (sizeArray[y].label == "Large"){
        flickrSourceArray.push({"FlickrLarge": sizeArray[y].source});
      }
    }
  }

  return flickrSourceArray
}

但是,第四,当我尝试执行 fetch 并呈现集合时,我只获取集合中没有 FlickrUrl 属性集的对象。

//create an array of models and then pass them in collection creation method
var armorGroup = new ArmorApp.ArmorCollection();

armorGroup.fetch().then(function(){
  console.log(armorGroup.toJSON());
  var armorGroupView = new ArmorApp.allArmorView({collection: armorGroup});
  $("#allArmor").html(armorGroupView.render().el);
});

var armorRouter = new ArmorApp.Router();

Backbone.history.start();

最后一个 sn-p 中的 console.log 打印出所有假定通过 fetch 实例化的对象/模型。但是它们都没有包含在初始化期间应该是set 的额外属性。

有什么想法吗?

【问题讨论】:

    标签: backbone.js


    【解决方案1】:

    这是什么功能? getFlickrSources(flickrapi)

    为什么在初始化函数中使用 this.get。老实说,对于您正在尝试做的事情来说,它看起来过于复杂。

    如果您想在实例化模型时设置一些参数,请执行此操作 var model = new Model({ param:"someparam", url:"someurl",wtv:"somewtv"} );

    如果要更新模型,只需在模型中编写一个更新函数,例如 update: function (newparam) { this.set;... etc 并在需要时调用它.

    如果我读得很好,您只想在模型实例化时设置一些参数,所以只需使用我上面指定的内容。这是更多文档:http://backbonejs.org/#Model-constructor

    我希望它有所帮助。

    编辑:

    把你的电话放在你的模型外面,你不应该(imo)在你的模型里面打电话,这样看起来有点脏。

    Sources.then(function(flickrdata) {
        var mymodel = new Model({flicker:flickrdata.wtv});
    });
    

    在我看来会更干净。

    【讨论】:

    • 嗯,我不怀疑它过于复杂。但我想我基本上是在做你描述的this.set 方法。但在我设置属性 FlickerSmall 之前,我必须从闪烁 API 请求所需图像的 url。这就是为什么我必须将then()' function. I have to set the property after the request completes. I have added the getFlickerSources` 中的属性设置为我的原始帖子。我真的很感激你的想法。我知道这是一个复杂(也许令人费解)的问题。
    • 不要在你的 init 中使用 this.set 并且不要在 init 中调用你的东西。在 mycall.then(fucntion() { new Model({FlickerSmall:... } 明白我的意思吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-31
    • 1970-01-01
    相关资源
    最近更新 更多