标签: backbone.js-collections

Backbone Collection有多个型号?

我正在学习Backbone.

我想创建一个包含不同模型的列表,具有不同的属性.

例如,按任何顺序列出文件夹内容,其中可包括类型文件的模型和类型文件夹的模型.

file : {
  title : "",
  date : "",
  type : "",
  yaddayadda : ""
}

folder : {
  title : "",
  date : "",
  haminahamina : ""
}
Run Code Online (Sandbox Code Playgroud)

在Backbone中表示这个的正确方法是什么?是否可以使用多个模型的单个集合?

javascript backbone.js backbone.js-collections

13
推荐指数
2
解决办法
1万
查看次数

通过cid而不是id在Backbone.js集合中查找模型

对于尚未保存到服务器的模型,我可以使用Collection.get(id)通过cid在Backbone.js集合中查找模型吗?

从文档中看,似乎.get应该通过id或cid找到一个模型.但是,collection.get(cid)没有找到模型,而这确实如此collection.find(function(model) {return model.cid===cid; }).据推测,我忽略了一些基本的东西.

jsFiddle例如下面

var Element = Backbone.Model.extend({});
var Elements = Backbone.Collection.extend({ model:  Element });

var elements = new Elements(), el, cids = [];

for (var i=0; i<4; i++) {
    el = new Element({name: "element"+i})
    elements.add(el);
    cids.push(el.cid);
}

console.log(cids);
el1 = elements.get(cids[0]);     
console.log(el1);  // undefined


el1a = elements.find(function(model) { return model.cid === cids[0]; });
console.log(el1a);  // success
Run Code Online (Sandbox Code Playgroud)

Backbone.js - id vs idAttribute vs cid

javascript backbone.js backbone.js-collections

13
推荐指数
1
解决办法
1万
查看次数

For Loop over Backbone Collection

骨干相当新,所以这是一个非常基本的问题.我有一个Backbone集合传递给一个函数,我可以证明它已经通过,并且集合中的模型有id.

这是我如何设置ID -

convertToMapObjects: (results)  =>
   objectList = new ObjectList()
   results.each(result)->
    testObj = new TestObject()
    testObj.set
      id = result.get("id")
    objectList.add(testObj)
Run Code Online (Sandbox Code Playgroud)

在另一个函数中(通过使模型触发事件来访问) -

getIds: (objects) =>
ids = (object.id for object in objects) 
Run Code Online (Sandbox Code Playgroud)

我认为问题可能是因为我正在迭代这个集合,因为当我尝试的时候

for object in objects
   console.log(object)
Run Code Online (Sandbox Code Playgroud)

我看到两个未定义的.它是否正确?如果是这样,为什么我不能使用for循环来通过骨干集合?还有,我有办法吗?

javascript model coffeescript backbone.js backbone.js-collections

12
推荐指数
2
解决办法
2万
查看次数

Backbone.js - 如何从集合中获取对象文字数组?

我试图保持一组对象文字与服务器数据同步.这些对象通过backbone.googlemaps扩展程序放置在Google地图上.

我有一个集合:

var LocationList = Backbone.Collection.extend({ model: Location, url: '/locations' })

如何从此LocationList集合中获取对象文字数组?我的目标是这样的:

[{name: "Home", address: "123 Pleasant St"}, {name: "Work", address: "123 Unpleasant St"}]

javascript backbone.js backbone.js-collections

12
推荐指数
1
解决办法
1万
查看次数

Backbone嵌套集合

我有一个骨干应用程序从服务器检索数据.这些数据是酒店和foreach酒店我有更多的房间.我已将酒店划分为json和另一个json内的房间,如下所示:

hotel.json

[
  {
    "id": "1", 
    "name": "Hotel1"
  }, 
  {
    "id": "2", 
    "name": "Hotel2"
  }, 
  {
    "id": "3", 
    "name": "Hotel3"
  }
]
Run Code Online (Sandbox Code Playgroud)

rooms.json

[
  {
    "id" : "r1",
    "hotel_id" : "1",
    "name" : "Singola",
    "level" : "1"
  },
  {
    "id" : "r1_1",
    "hotel_id" : "1",
    "name" : "Doppia",
    "level" : "2"
  },
  {
    "id" : "r1_3",
    "hotel_id" : "1",
    "name" : "Doppia Uso singol",
    "level" : "1"
  },
  {
    "id" : "r2",
    "hotel_id" : "2",
    "name" : "Singola",
    "level" : …
Run Code Online (Sandbox Code Playgroud)

javascript backbone.js backbone.js-collections

11
推荐指数
1
解决办法
6001
查看次数

检索添加到Backbone.js Collection的项目的索引位置

如果我将一个项目添加到Collection中,如何找到添加它的位置?用于添加Underscore.js文档表明,实现此目的的唯一方法是绑定到add事件.

还有其他方法吗?如果没有,那我怎样才能从我的回调中重新索引索引?我尝试提供回调:

foo:function(model, options) {
  console.log("foo: " + options.index);
},
Run Code Online (Sandbox Code Playgroud)

但是options.index是undefined.我用这段代码绑定到事件:

this.collection.bind('add', this.foo);
Run Code Online (Sandbox Code Playgroud)

并使用以下代码添加项目:

this.collection.add(myNewItem);
Run Code Online (Sandbox Code Playgroud)

该系列中的模型是:

MyModel = Backbone.Model.extend({
defaults : {
   key:undefined,
   myObj:undefined,
},
Run Code Online (Sandbox Code Playgroud)

该系列是:

MyModel List = Backbone.Collection.extend({
      model: MyModel,

initialize: function() {
   this.comparator = function(aModel) {
   return aModel.get('key'); 
  };
 }});
Run Code Online (Sandbox Code Playgroud)

我将模型添加到集合中:

 var key = "always_the_same";
var mm = new MyModel({key:key});
this.collection.add(mm);
var index = this.collection.sortedIndex(mm , this.collection.comparator));
Run Code Online (Sandbox Code Playgroud)

更新

问题是(我认为),比较器函数用于indexOf和sortedIndexOf,因此,就比较器函数而言,具有相同键的两个对象实际上是相同的对象.

我曾希望*CID将用于确保对象实际上是我在已经排序的集合中寻找的对象.但似乎没有.我想一个可能的解决方案是更改我的比较器功能以包含CID:

initialize: function() {
        this.comparator = function(aModel) {
          return aModel.get('key') + aModel.cid; …
Run Code Online (Sandbox Code Playgroud)

backbone.js underscore.js backbone.js-collections

10
推荐指数
2
解决办法
1万
查看次数

检测何时获取主干集合(Backbone 1.0.0)

最新版本的Backbone中有一种新行为(1.0.0,其中在获取Collection后,默认情况下不再触发重置事件.

http://backbonejs.org/#changelog

重命名Collection的"更新"以设置,与类似的model.set()并行,并与reset对比.它现在是获取后的默认更新机制.如果您想继续使用"重置",请通过{reset:true}.

问题是我想在最终获取集合时捕获事件(确实非常常见!)

我可以听取添加,删除和更改事件,但如果集合是空的,我不知道如何捕获事件.

那么,什么是新的,推荐的方式来捕获收集请求何时完成,或者它是否通过{reset = true}实现它的唯一方法?

ps:这是原始问题,BTW 无法捕获Backbone Collection重置事件

backbone.js backbone.js-collections

10
推荐指数
2
解决办法
2万
查看次数

什么是AngularJS等同于Backbone的集合?

在Angular JS中是否有相当于Backbone的CollectionExt JS的商店?我正在学习$ resource,但并没有完全掌握这方面的内容.

调节器

// This is the "collection" I'm interested in.
$scope.foos = [];

// Foo is a $resource.
Foo.query(function (foos) {

  // This works, but is there a smarter "collection" object?
  $scope.foos = foos;
});

$scope.createFoo = function (data) {
  var foo = new Foo(data);

  foo.$save(function (shinyNewFoo) {
    $scope.foos.unshift(shinyNewFoo);
  });
};
Run Code Online (Sandbox Code Playgroud)

说明

$scope.createFoo我制作一个新的Foo,坚持它,然后将它添加到我的穷人的集合,一个阵列.这工作正常,视图正确更新,但我太懒了.理想情况下,我想要一个我可以添加和删除的"集合"将自动POST/DELETE.也许类似以下内容.

假装实施

$scope.fooCollection = new CoolCollection({
  // specify the type of resources this collection will …
Run Code Online (Sandbox Code Playgroud)

javascript angularjs backbone.js-collections extjs-stores angular-resource

10
推荐指数
1
解决办法
3540
查看次数

BackboneJS model.url使用collection.url

根据我的理解,Backbone JS Models的默认行为是返回Collection的URL,除非模型有urlRoot指定的.我似乎无法让这种行为发挥作用.

从文档:

model.url()...默认情况下生成以下形式的URL:"[collection.url]/[id]",但如果不考虑模型的集合,则可以通过指定显式urlRoot来覆盖.

这是我的集合和模型:

var MyCollection = Backbone.Collection.extend({
    model: Model,
    initialize: function(options){
        this.options = options || {};
    },
    url: function(){
        return "/theurl/" + this.options.param;
    }
});
return MyCollection;
Run Code Online (Sandbox Code Playgroud)

...

var MyModel = Backbone.Model.extend({
    urlRoot: '/theurl',
    initialize: function() {
    }
});
return MyModel;
Run Code Online (Sandbox Code Playgroud)

加载模型时没有集合,它可以很好地提交/theurl,但是当它被加载到集合中时,所有方法都会提交给/theurl/param/.

如果我正确理解文档,urlRoot那么模型应该覆盖这种行为; 甚至那时模型url应该是/theurl/param/{MODEL-ID}.

关于我遗失/误解的任何想法?

...

PS:model: Model来自该系列的产品是通过RequireJS引入的

backbone.js backbone.js-collections

9
推荐指数
1
解决办法
1万
查看次数

带有数据选项的Backbone.js fetch方法是使用方括号传递URL params

我有以下代码来获取我的集合的数据,但指定了应该来自服务器的颜色:

fruits = new FruitsCollection();
fruits.fetch({
    data: {color: ['red', 'green']}
});
Run Code Online (Sandbox Code Playgroud)

这就是我的期望:

http://localhost:8000/api/fruits/?color=red&color=green
Run Code Online (Sandbox Code Playgroud)

这就是我得到的:

http://localhost:8000/api/fruits/?color[]=red&color[]=green
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,由于一些未知的原因,Backbone.js将方括号添加到URL参数,而不是color=green我有color[]=green

我在服务器端使用django-rest-framework,我知道我可以在那里进行硬编码修复,但我更喜欢知道逻辑原因,因为它正在发生,我如何从我的javascript中解决它.

backbone.js backbone.js-collections

9
推荐指数
1
解决办法
1万
查看次数