动态加载我的'ID'到我的Backbone Collection?

时间:2014-04-03 11:46:45

标签: javascript jquery backbone.js

好的,我已经在这里找到了另一个问题的答案,但我正在努力做一些事情。我有一个Backbone设置如下,

var MyModel= Backbone.Model.extend();

var MyCol = Backbone.Collection.extend({
model : MyModel,
url: '/GetData/2',
parse: function(response) {
  return response;
    }
});

var stuff = new MyCol;

stuff.fetch({
   success: function (collection, response) {
        console.log(response);
   }
})

现在这段代码完全有效。现在要解释一下,URL设置为PHP Slim,返回JSON encoded data,其中将有四个key/pair分组,例如:

<code> { id; XX, data: XX, another:XX, last:YY } </code>

这些数据是从数据库接收的,现在我该如何动态地执行此操作?我的意思是,在我的收藏集的URL'行中,它将2作为current ID传递。如何backbone调用我需要的每个ID,数据库中当前有6个列表。所以我需要display/console log(目前用于测试)所有6输入,那么如何将ID输入更改为1-6?我应该只使用for loo吗?如果从数据库中删除列表或者添加更多列表,我真的想要一些不需要改变的东西吗?

这个JSON data的最终目标是加载到我的Backbone viewtemplateform

欢迎大家帮忙,

由于

格伦

P.S对不起,如果我的拼写关闭,我是阅读障碍,也可能没有解释正确的事情,所以让我知道,我会改进我的措辞,谢谢。

EDITS

这就是我现在正在使用的东西::

 var AdminModel = Backbone.Model.extend({
   defaults: {},
   urlRoot: '/GetData'

 });

 var AdminColModel = Backbone.Collection.extend({
model : AdminModel,
url: '/',
parse: function(response) {
  //console.log(response);
  return response;
    }
});

 var stuff = new AdminColModel;

  stuff.fetch({
    success: function (collection, response) {
     console.log(collection);
   } 
 })

这根本不是控制台记录的东西吗?但是PHP已经设置好了,所以当你转到 /getData 时,如果数据库中的所有行都得到一个完整的列表。当你查看/ getData / X&lt; - X是id号时,它将只返回那些行ID数据。

格伦

2 个答案:

答案 0 :(得分:1)

您不应该在集合级别为集合中的每个模型提出单独的请求。您为集合设置的URL应默认请求所有模型。所以不是:

 '/GetData/2'

应该是:

 '/GetData'

然后,在服务器端,您应确保GetData操作返回所有MyModels

然后,您可以为GetData编写带有参数的覆盖,以返回单个模型或过滤结果。您将对单个模型检索特别感兴趣,它应该是模型级别使用的URL。事实上,你已经有了这个动作,因为你正在使用它(错误地)来检索集合。这是与/GetData/2网址相关联的操作。此操作应该是在模型中调用fetch时使用的操作, 集合。

希望这有帮助。

发布修改

添加一些代码以提供帮助。

var AdminModel = Backbone.Model.extend({
    urlRoot: '/GetData'
});

var AdminCollection = Backbone.Collection.extend({
    model : AdminModel,
    url: '/GetData'
});

var wholeCollection= new AdminCollection();

// the fetch method on the collection uses the AdminCollection.url property
wholeCollection.fetch({
    success: function (collection) {
        console.log(collection); // will output collection object to console
    } 
});

// this model does not exist in any collection
var modelOutsideCollection = new AdminModel({}, { id: "2" });

// because the model is not in a collection, fetch uses the AdminModel.urlRoot proeprty
modelOutsideCollection.fetch({
    success: function (model) {
        console.log(model); // outputs a single model with id of 2 to collection
    } 
}); 

答案 1 :(得分:0)

所以......你似乎正在做的事情会让真的很难(甚至可能)与Backbone合作。

你应该拥有的是API端点(例如)&#34; getData&#34;这将返回所有模型:

[
  {id: 1, name: "asdflj"},
  {id: 2, name: "lsdfkjg"},
  // etc.
]

然后,你定义&#34; getData&#34;作为集合的网址。对于集合中的每个模型,Backbone将自动计算模型实例的URL作为(例如)&#34; getData / 2&#34; (如果模型&#39; s id是2)。

换句话说,您需要更改API才能拥有:

  • getData - &gt;返回所有模型
  • getData / 2 - &gt;返回ID为2的模型