Backbone:在变量中输入JSON而不是通过URL获取

时间:2013-12-10 09:36:28

标签: javascript php jquery json backbone.js

我们正在尝试修改现有的脚本,该脚本使用backbone.js从URL获取JSON并在屏幕上以定义的方式呈现它。

之前,该脚本指向外部PHP文件以从中获取JSON。

url: function () {          
    var ajaxValue = document.getElementById('ajax').value;
    if(ajaxValue==0){
        return this.options.apiBase + '/liveEvents.json';           
    } else {
        var eventDate = document.getElementById('timestamp').value;
        return this.options.apiBase + '/ajax.php?eventDate='+eventDate;         
    }
},

但是现在我们试图省略PHP的要求并纯粹使用Javascript获取JSON。为此,我们创建了一个JS函数fetch_data_set(),它返回正确的JSON

var ArrayMerge = array1.concat(array2,array3,array4);
return JSON.stringify(ArrayMerge);

所以我们的问题是,我们如何将这个JSON提供给骨干而不是使用外部URL。因为如果我们这样做(这显然是错误的):

 url: function () {         
    var ajaxValue = document.getElementById('ajax').value;
    if(ajaxValue==0){           
        var data_set = fetch_data_set();
        return data_set;
    } 
},

抛出错误:错误:必须指定“url”属性或函数

2 个答案:

答案 0 :(得分:0)

主键是扩展Backbone.sync而不是url()方法,因此您可以使用这种方式在任何类型的模型中获取模型,并且您可以执行类似此链接的操作:

https://github.com/huffingtonpost/backbone-fixtures/blob/master/backbone-fixtures.js

答案 1 :(得分:0)

Backbone.Model包含一个sync()函数,可以从url加载JSON数据。 sync()使用url()函数来确定应从何处获取数据。 (注意:sync()是由save()fetch()destroy()

引发的。

这里的诀窍是你应该停止覆盖url()并直接重新实现sync(),参见http://backbonejs.org/#Model-sync

以下是一个例子:

// specialized version to be used with a store.js - like object
sync: function(method, model, options) {
  console.log("sync_to_store begin('"+method+"',...) called with ", arguments);
  var when_deferred = when.defer();

  var id = this.url();

  if(method === "read") {
    if(typeof id === 'undefined')
      throw new Error("can't fetch without id !");
    var data = model.store_.get(id);
    // apply fetched data
    model.set(data);
    when_deferred.resolve( [model, undefined, options] );
  }
  else if(method === "create") {
    // use Backbone id as server id
    model.id = model.cid;
    model.store_.set(id, model.attributes);
    when_deferred.resolve( [model, undefined, options] );
  }
  else if(method === "update") {
    if(typeof id === 'undefined')
      throw new Error("can't update without id !");
    model.store_.set(id, model.attributes);
    when_deferred.resolve( [model, undefined, options] );
  }
  else if(method === "delete") {
    if(typeof id === 'undefined')
      throw new Error("can't delete without id !");
    model.store_.set(id, undefined);
    model.id = undefined;
    when_deferred.resolve( [model, undefined, options] );
  }
  else {
    // WAT ?
  }

  console.log("sync_to_store end - Current changes = ", model.changed_attributes());
  return when_deferred.promise;
}
  • 注1:自返回以来,API与vanilla Backbone略有不同 承诺时
  • 注2:仍然使用url()作为id