问题:文档很少,而且我是一个菜鸟 - 任何人都可以确认正确的(假设有一种)方法将Backbone.Views绑定到Backbone.RelationalModel的实例(来自backbone-relational.js)更新/渲染到dom?基于Backbone中正常的模型/视图绑定,我尝试了一些不同的方法,但收效甚微.
背景故事(/更多信息): 我正在学习Backbone.js的绳索,并且在过去的一周里不得不接受很多.如果我遗漏了一些明显的东西(极有可能 - 包括以下处理我问题的"正确"方式),请打电话给我.
我正在处理一个mongodb支持的REST接口(我没有完全控制 - 或者我将重新设计服务器端的行为),它充分利用了嵌套字典,所以我一直在阅读如何在Backbone中最好地表示(虽然没有打破Backbone提供的伟大的save()+服务器同步).
我见过两种选择:backbone-relational和ligament.js.
我开始使用backbone-relational.js,并且为树中的各种字典创建了RelationalModel(骨干关系代替Backbone的标准模型),这些字典由REST接口传回.定义它们之间的关系,并且控制台记录每个模型的JSON(在它们各自的初始化函数中)显示它们都在整个集合级别的fetch()命令上正确地从服务器上调用/加载.
所以,这一切都很棒.
问题:我有"监听"每个模型的更新视图(以及应该在dom上渲染模板的绑定函数),并且它们根本不会"触发"(更不用说渲染......).主视图触发fetch(),没有问题,加载"顶级"模型并在dom上呈现它 - 但代表"顶级"模型中的"外键"模型的视图永远不会(尽管数据肯定会加载到每个模型中,如上面提到的每个模型的控制台登录所示.
非常感谢任何见解.
直接回复下面的Raynos回复(感谢Raynos!): 如果我为UpperLevelCollection定义了一个基本url,而UpperLevelModels存在于服务器上的(UpperLevelCollection url)/(UpperLevelModel id),那么我如何将这些LowerLevelCollections映射到字典键中服务器端的每个UpperLevelModel的一个JSON转储?换句话说,使用模型中的集合可以正确地处理来自服务器的数据转储(显然非常简化,但可以解决问题)并正确保存/更新/同步它?
[{
"some_key": "Some string",
"labels": ["A","List","Of","Strings"],
"content": [{
"id": "12345"
"another_key": "Some string",
"list": ["A","list","of","strings"],
},{
"id": "67890"
"another_key": "Some string",
"list": ["A","list","of","strings"],
}],
}]
Run Code Online (Sandbox Code Playgroud) 我正在使用underscore.js进行模板化.这是一个示例模板.
<script id="discussion-template" type="text/html">
[[ _.each(discussions, function(topic){ ]]
<li>
<article id="{{ topic.htmlId() }}">
<a class="section-arrow mir" href="#">toggle</a>
<h3>{{ topic.get('text') }}</h3>
<ol></ol>
</article>
</li>
[[ }); ]]
</script>
Run Code Online (Sandbox Code Playgroud)
在backbone.js view.render()里面我将一个集合传递给模板.
this.el.append(this.template({ discussions: this.collection.models }));
Run Code Online (Sandbox Code Playgroud)
我的问题是,我是否必须编写循环代码?我可以不只是传入一个集合,并且下划线足够聪明,可以在集合中为每个项目呈现一个项目吗?underscore.js也为嵌套模板提供了一些东西吗?集合中的每个项目实际上都有我需要渲染的项目集合.如何从此模板中调用另一个模板.当然,非常感谢任何链接,提示和/或教程.
谢谢!
javascript templates backbone.js underscore.js backbone-relational
一直试图让它运行一段时间.基本上我有一个休息api作为后端返回json,一切都很好.
我遇到的问题是骨干关系.我确定我错了,但我一直在寻找网络一段时间,找不到任何帮助.
我试图在"职业"和"武器"模型之间建立很多关系.这是我的代码:
Profession = Backbone.RelationalModel.extend({
urlRoot: '../api/professions',
relations: [{
type: Backbone.HasMany,
key: 'weapons',
relatedModel: 'Weapon',
collectionType: 'Weapons',
reverseRelation: {
key: 'profession',
includeInJSON: 'id',
keySource: 'profession_id'
}
}]
});
Weapon = Backbone.RelationalModel.extend({
urlRoot: '../api/weapons'
});
Weapons = Backbone.Collection.extend({
model: Weapon,
url: function(models){
return '../api/weapons';
}
});
Run Code Online (Sandbox Code Playgroud)
并调用那些api端点返回:
{name: "Profession1", id: 1}
[{name: "Weapon1", profession_id: 1}, {name: "Weapon2", profession_id: 1}]
Run Code Online (Sandbox Code Playgroud)
所以,如果我理解正确,profession.fetchRelated('weapons')应该发送一个httprequest到武器集合的url并拉出具有1的profession_id的对象.但是当我运行时没有任何反应profession.fetchRelated('weapons')
我需要在初始化时将视图中的值传递给集合中的每个模型.
Till Collection我们可以在Backbone.Collection构造函数中传递'options'.
在此之后,是否有任何技术可以将一些"选项"传递到集合中的每个模型中?
var Song = Backbone.Model.extend({
defaults: {
name: "Not specified",
artist: "Not specified"
},
initialize: function (attributes, options) {
//Need the some_imp_value accessible here
},
});
var Album = Backbone.Collection.extend({
model: Song
initialize: function (models, options) {
this.some_imp_value = option.some_imp_value;
}
});
Run Code Online (Sandbox Code Playgroud) Backbone.js View可以有一个Model和一个Collection?
我问的原因是因为我正在使用一个View,其中包含一个绘有地点的地图(使用传单库).
这Collection是一组模型,其中包含要在地图上绘制的坐标.
该Model像地图边界和地图形状保持的东西.
不知道还有什么可以拉掉这个......
任何帮助表示赞赏,谢谢!
到目前为止,我的骨干关系工作得相当好.我建立了良好的关系和反向关系(见下文).当我最初调用.fetch()我的Country模型实例时,nominees数组被nominee完美地解析为模型.
.fetch()然而,当我稍后再次呼叫时,即使nominee数据已经改变(例如,投票计数增加),这些相关模型也不会更新.从本质上讲,Backbone的.set()方法似乎最初了解关系,但后来却不了解.
国家模式
var Country = Backbone.RelationalModel.extend({
baseUrl : config.service.url + '/country',
url : function () {
return this.baseUrl;
},
relations : [
{
type : Backbone.HasMany,
key : 'nominees',
relatedModel : Nominee,
collectionType : Nominee_Collection,
reverseRelation : {
key : 'country',
includeInJSON : false
}
}
]
});
Run Code Online (Sandbox Code Playgroud)
JSON响应 country.fetch()
{
"entrant_count" : 1234,
"vote_count" : 1234,
"nominees" : [
{
"id" : 3,
"name" : …Run Code Online (Sandbox Code Playgroud) 我需要在客户端销毁骨干关系模型,而不执行任何http请求.在"破坏"一词下,我的意思是从所有集合中删除模型,从其他模型中删除所有关系到当前模型,最后删除有关当前模型的所有数据.
如何实现这一目标?
我正在使用Backbone关系,这很棒.我遇到的问题是当我需要后端提供要附加的模型的URL时.
当使用一对一关系时,这不是一个问题,因为模型可以将url作为其自身的属性保留.
另一方面,该集合在其自身内创建了一个单独的模型.
将这些绑定在一起的最佳方法是什么.以下示例
{
"user": {
"url": "http://example.com/api/user/1"
},
"permissions": {
"url": "http://example.com/api/user/1/permissions"
}
}
Run Code Online (Sandbox Code Playgroud)
在上面的示例中,我希望用户是提供了url的模型,以及提供了url的集合的权限.
我试过的是让收集工作如下:
{
"permissions": {
"url": "https://example.com/api/user/1/permissions"
"data": []
}
}
Run Code Online (Sandbox Code Playgroud)
但我无法运行解析变量的解析.
我正在使用一个相对较大的骨干代码库,似乎每当我得到一个javascript错误,无论它是什么.控制台中显示的堆栈跟踪看起来完全相同(下面的示例).我的所有模型/视图都是通过骨干.extend方法创建的.有没有其他人有这个问题,或知道如何解决它?我通常必须在任何地方放置console.log语句以找到错误的来源并且非常耗时.谢谢.
jquery-1.5.min.js:16 Uncaught InvalidConstructorArgs
d.extend._Deferred.f.resolveWith jquery-1.5.min.js:16
v jquery-1.5.min.js:16
d.support.ajax.d.ajaxTransport.send.c jquery-1.5.min.js:16
Run Code Online (Sandbox Code Playgroud) javascript javascript-framework backbone.js backbone-relational
我正在尝试使用Backbone.Relational在我的应用程序中设置一些关联.
基本上我有Backbone Search和Service模型.搜索具有ServiceList包含许多服务的集合.
但是,我似乎无法从服务初始化程序中访问父搜索.当我尝试记录父搜索时,我得到了null.谁能看到我做错了什么?
我的搜索模型设置如此(代码可能有语法错误,我正在动态地从coffeescript翻译):
var Search = new Backbone.RelationalModel({
urlRoot: '/searches',
relations: [{
type: Backbone.HasMany,
key: 'services',
relatedModel: 'Service',
collectionType: 'ServiceList',
reverseRelation: {
key: 'search'
}
}],
initialize: function(options) {
// => Search "has services:", ServiceList
console.log this, "has services:", @get('services');
}
});
var Service = new Backbone.RelationalModel
initialize: function() {
// => Service "in" null
console.log this, "in", @get('search');
}
});
Run Code Online (Sandbox Code Playgroud)
或者如果您更喜欢CoffeeScript:
class Search extends Backbone.RelationalModel
urlRoot: '/searches'
relations: …Run Code Online (Sandbox Code Playgroud)