gpt4 book ai didi

未使用 Backbone.js 集合模型值

转载 作者:行者123 更新时间:2023-12-05 00:03:02 25 4
gpt4 key购买 nike

Backbone 没有使用为集合指定的模型。我肯定错过了什么。

App.Models.Folder = Backbone.Model.extend({
initialize: function() {
_.extend(this, Backbone.Events);

this.url = "/folders";
this.items = new App.Collections.FolderItems();
this.items.url = '/folders/' + this.id + '/items';
},

get_item: function(id) {
return this.items.get(id);
}
});

App.Collections.FolderItems = Backbone.Collection.extend({
model: App.Models.FolderItem
});

App.Models.FolderItem = Backbone.Model.extend({
initialize: function() {
console.log("FOLDER ITEM INIT");
}
});


var folder = new App.Models.Folder({id:id})
folder.fetch();

// later on change event in a view
folder.items.fetch();

加载文件夹,然后加载项目,但它们不是 FolderItem 对象并且永远不会调用 FOLDER ITEM INIT。它们是基本的模型对象。

我错过了什么?我应该以不同的方式这样做吗?

编辑:
不知道为什么这与文档相比有效,但以下有效。主干 5.3
App.Collections.FolderItems = Backbone.Collection.extend({
model: function(attributes) {
return new App.Models.FolderItem(attributes);
}
});

最佳答案

问题是您的模型与集合的声明顺序。基本上,您需要先定义模型。

App.Models.FolderItem = Backbone.Model.extend({...});

App.Collections.FolderItems = Backbone.Collection.extend({
model: App.Models.FolderItem
});

原因是主干对象是用对象字面量语法定义的,这意味着它们在定义时立即进行评估。

此代码的功能相同,但说明了对象字面量的性质:
var folderItemDef = { ... };

var folderItemsDef = {
model: App.Models.FolderItem
}

App.Models.FolderItem = Backbone.Model.extend(folderItemDef);

App.Collections.FolderItems = Backbone.Collection.extend(folderItemsDef);

你可以在这个例子中看到 folderItemDef 和 folderItems Def 都是对象字面量,它们有它们的 key: value在定义文字后立即评估对。

在您的原始代码中,您首先定义了集合。这意味着 App.Models.FolderItem定义集合时未定义。所以你基本上是这样做的:
App.Collection.extend({
model: undefined
});

但是,通过将模型定义移动到集合定义之上,集合将能够找到模型并将其正确关联。

FWIW:您设置集合模型的函数版本有效的原因是,在执行应用程序并将模型加载到集合中之前,不会评估该函数。此时,javascript 解释器已经找到模型的定义并正确加载它。

关于未使用 Backbone.js 集合模型值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7264762/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com