我正在学习Backbone.
我想创建一个包含不同模型的列表,具有不同的属性.
例如,按任何顺序列出文件夹内容,其中可包括类型文件的模型和类型文件夹的模型.
file : {
title : "",
date : "",
type : "",
yaddayadda : ""
}
folder : {
title : "",
date : "",
haminahamina : ""
}
Run Code Online (Sandbox Code Playgroud)
在Backbone中表示这个的正确方法是什么?是否可以使用多个模型的单个集合?
对于尚未保存到服务器的模型,我可以使用Collection.get(id)通过cid在Backbone.js集合中查找模型吗?
从文档中看,似乎.get应该通过id或cid找到一个模型.但是,collection.get(cid)没有找到模型,而这确实如此collection.find(function(model) {return model.cid===cid; }).据推测,我忽略了一些基本的东西.
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集合传递给一个函数,我可以证明它已经通过,并且集合中的模型有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
我试图保持一组对象文字与服务器数据同步.这些对象通过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"}]
我有一个骨干应用程序从服务器检索数据.这些数据是酒店和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) 如果我将一个项目添加到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中有一种新行为(1.0.0,其中在获取Collection后,默认情况下不再触发重置事件.
http://backbonejs.org/#changelog
重命名Collection的"更新"以设置,与类似的model.set()并行,并与reset对比.它现在是获取后的默认更新机制.如果您想继续使用"重置",请通过{reset:true}.
问题是我想在最终获取集合时捕获事件(确实非常常见!)
我可以听取添加,删除和更改事件,但如果集合是空的,我不知道如何捕获事件.
那么,什么是新的,推荐的方式来捕获收集请求何时完成,或者它是否通过{reset = true}实现它的唯一方法?
ps:这是原始问题,BTW 无法捕获Backbone Collection重置事件
在Angular JS中是否有相当于Backbone的Collection或Ext 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
根据我的理解,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引入的
我有以下代码来获取我的集合的数据,但指定了应该来自服务器的颜色:
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中解决它.