我已经使用Marionette几个星期了,刚刚发现了Backbone Relational,所以我想弄清楚如何整合这两者.理想情况下,我想使用复合视图来呈现这样构造的数据,其中每个'item'都有自己的项视图:
list : {
name : 'List 1',
items : [
item1 : {
name : 'Item 1',
id : 1
},
item2 : { ... }
item3 : { ... }
]
}
Run Code Online (Sandbox Code Playgroud)
通常使用复合视图,您需要拥有一组模型,它们将迭代以呈现每个项目.通过关系,我只有一个模型(列表),并且该模型中有一个集合(项目).是否有可能使用Marionette的视图渲染出来,或者我是否需要使用简单的Backbone视图并自己处理渲染和迭代?
我正在尝试实现BackboneRelational并继续获取
"无法实例化多个Backbone.RelationalModel,每个类型具有相同的id!"
class App.Models.User extends Backbone.RelationalModel
urlRoot : '/api/users'
idAttribute: 'id'
relations: [
type: Backbone.HasMany
key: 'plots'
relatedModel: 'App.Models.Plot'
collectionType: 'App.Collections.Plots'
includeInJSON: false
reverseRelation:
key: 'user_id',
includeInJSON: 'id'
]
class App.Models.Plot extends Backbone.RelationalModel
urlRoot : '/api/plots'
idAttribute: 'id'
Run Code Online (Sandbox Code Playgroud)
如果我切换其中一个模型来扩展Backbone.Model我可以实例化这两个模型,但是我得到了关系功能被破坏的所有警告.
我想要实现以下目标:
plot = new App.Models.Plot({id : 700})
plot.fetch()
plot.get('user')
Run Code Online (Sandbox Code Playgroud)
我错过了什么?
javascript model-view-controller backbone.js backbone-relational
我一直在使用骨干关系(https://github.com/PaulUithol/Backbone-relational)来构建我的应用程序,因为我有一个模型(Room),附带了许多其他模型:
正如您在本期中所看到的,我一直收到错误
Error: Cannot instantiate more than one Backbone.RelationalModel with the same id per type
每当我更改View或重新加载Collection时.
现在我知道有一个线程在这里他们建议使用在那里findOrCreate
,但我没有单独访问模型,但我不使用Collection.fetch
.有没有解决这个问题的方法?
经过另一项长期研究,出来了:-)似乎问题是关于函数"getObjectByName".它不能与requireJS(ADM)一起使用.目前,我必须设置一个globel var来解决问题.我相信一定有更好的解决方案.
这是我的临时解决方案:
(1)设置全局var并将搜索模型范围设置为全局("APP")
var APP = {};
define(['backbone-relational'], function(){
Backbone.Relational.store.addModelScope(APP);
})
Run Code Online (Sandbox Code Playgroud)
(2)将您的关系模型导出到全局
APP.YourRelationalModel = YourRelationModel;
Run Code Online (Sandbox Code Playgroud)
它有效,虽然不好......我真的很期待一个更好的答案.谢谢.
// ------------
测试版本:
1.Backbone-Relational 0.8.5
2.Backbone 1.0.0 and Underscore 1.4.4
3.JQuery 1.8.3
4.RequireJS 2.1.5
Run Code Online (Sandbox Code Playgroud)
代码非常简单:(或参见https://github.com/bighammer/test_relational_amd.git)
require.config({
paths : {
js : 'js',
jquery : 'js/jquery-1.8.3',
underscore : 'js/underscore',
backbone : 'js/backbone',
'backbone-relational' : 'js/backbone-relational'
},
shim : {
underscore : {
exports : '_'
},
backbone : {
deps : ['underscore', 'jquery'],
exports : 'Backbone'
},
'backbone-relational' : {
deps: ['backbone'] …
Run Code Online (Sandbox Code Playgroud) 我有一个简单的应用程序,它定义了两个类,a Person
和a PersonGroup
,其中存在多对多关系.一个人可以没有任何组,或者被分配给所有组,以及介于两者之间的任何组.
backbonerelational.org上的示例建议使用中间模型来实现多对多关系,但是我不能将此模式用于获取(反序列化)和保存(序列化).
我想要做的是使用Backbone来反序列化类似于以下内容的JSON:
{
People:
[
{
"ID": 1,
"Name": "John"
},
{
"ID": 2,
"Name": "Bob"
},
{
"ID": 3,
"Name": "Tim"
},
],
PeopleGroups:
[
{
"ID": 1,
"Name": "Owners",
"People":
[
1,
2
],
},
{
"ID": 2,
"Name": "Everyone",
"People":
[
1,
2,
3
],
},
]
}
Run Code Online (Sandbox Code Playgroud)
我正在使用Knockback/Knockout进行数据绑定,所以问题是我需要能够通过引用访问关系.除非我能创建一个Knockback.CollectionObservable来包装集合并将ID解析为引用,否则ID数组对我没有任何帮助.
class TheModel extends Backbone.RelationalModel
relations:[
type: Backbone.HasMany
key: 'subModels'
relatedModel: SubModel
collectionType: SubModels
reverseRelation:
key: 'TheModel'
]
themodel = new the TheModel({subModels:[{#stuff},{#stuff},{#stuff}]})
Run Code Online (Sandbox Code Playgroud)
我有createModels,所以themodel.get('subModels')
返回一组模型.
现在,如果我将更改的subModel数据传递给 mymodel
themodel.set({subModels:[{changedstuff},{stuff},{stuff}]})
Run Code Online (Sandbox Code Playgroud)
不应该themodel
抛出一个change
事件?它不适合我.
如果我将相同的数据传入,则更是如此 mymodel
themodel.set({subModels:[{samestuff},{samestuff},{samestuff}]})
Run Code Online (Sandbox Code Playgroud)
themodel.attributes.subModels
投掷add
和update
事件,即使没有什么是新的.
我不确定为什么会出现这些问题,任何帮助都会很棒,谢谢!!!!
javascript model coffeescript backbone.js backbone-relational
我正在尝试让骨干关系插件与任务和消息之间的关联起作用.(任务有很多消息).
从标准rails/activerecord站点提取信息,该站点具有task_id字段作为外键.
问题是,除非我在反向关系中将密钥设置为"task_id",否则骨干关系不会在任何消息上填充"消息"字段,但这意味着,当从任务模型访问任务时在消息模型中,task_id字段填充了实际的任务对象,而不是被覆盖的'task_id'整数.
我猜有一种简单的方法可以将task_id指定为用于确定父任务的外键,但是将键表示的对象放在另一个字段中(例如,消息对象上的'task')...但是我无法弄清楚如何.任何想法都赞赏.代码如下
class Backbonescaffolddemo.Models.Task extends Backbone.RelationalModel
paramRoot: 'task'
relations: [{
type: Backbone.HasMany,
key: "messages",
relatedModel: "Backbonescaffolddemo.Models.Message",
collectionType: "Backbonescaffolddemo.Collections.MessagesCollection",
includeInJSON: true
reverseRelation: {
key: "task_id"
includeInJSON: true
}
}]
Run Code Online (Sandbox Code Playgroud) 可能有人提供了通过django-tastypie和骨干关系来运行django.db模型实例的多对多字段的示例吗?现在可以使用中间模型了.
from django.db import models
class Author(models.Model):
name = models.CharField(max_length=42)
class Book(models.Model):
authors = models.ManyToManyField(Author, related_name='books', through='Authorship')
title = models.CharField(max_length=42)
class Authorship(models.Model):
author = models.ForeignKey(Author)
book = models.ForeignKey(Book)
Run Code Online (Sandbox Code Playgroud)
以下是tastypie资源的配置:
from tastypie import fields, resources
class AuthorResource(resources.NamespacedModelResource):
books = fields.ToManyField('library.api.resources.AuthorshipResource', 'books')
class Meta:
resource_name = 'author'
queryset = models.Author.objects.all()
class BookResource(resources.NamespacedModelResource):
authors = fields.ToManyField('library.api.resources.AuthorshipResource', 'authors')
class Meta:
resource_name = 'book'
queryset = models.Book.objects.all()
class AuthorshipResource(resources.NamespacedModelResource):
author = fields.ToOneField('library.api.resources.AuthorResource', 'author')
book = fields.ToOneField('.api.resources.BookResource', 'book')
class Meta:
resource_name = 'authorship'
queryset = models.Authorship.objects.all() …
Run Code Online (Sandbox Code Playgroud) 我有两个模型(用户和任务),它们是实例Backbone.RelationalModel
.
这两个模型的关系如下:
// Task model
var Task = Backbone.RelationalModel.extend({
relations: [
{
type: 'HasOne',
key: 'user',
relatedModel: User
}
],
urlRoot: 'someUrl'
});
Run Code Online (Sandbox Code Playgroud)
然后我有一个代码看起来像这样的集合:
var FollowerCollection = Backbone.Collection.extend({
initialize: function () {
_.bindAll(this);
}
model: User
});
var User = Backbone.RelationalModel.extend({
});
Run Code Online (Sandbox Code Playgroud)
当我在FollowerCollection上进行提取时,我收到以下错误:
Uncaught TypeError: Cannot read property 'idAttribute' of undefined
Run Code Online (Sandbox Code Playgroud)
在骨干关系的1565行 backbone-relation version 0.5.0
这里是一段backbone-relation.js的代码
if ( !( model instanceof Backbone.Model ) ) {
// Try to find 'model' in Backbone.store. If it already exists, set the …
Run Code Online (Sandbox Code Playgroud) 我一直在寻找有关如何在Backbone中建立关系的信息,并且遇到了以下两个不错的插件:
两者似乎都存在了两年多,似乎很稳定.然而,Backbone-relational
一枝独秀对Backbone-associations
在以下条款:
one-to-one, one-to-many, many-to-one
我们在数据库中一样Backbone.js
)乍一看既然,我没有时间广泛浏览这两个插件,我想从有经验的人那里了解下面的事情:
javascript jquery backbone.js backbone-relational backbone-associations
backbone.js ×8
javascript ×5
coffeescript ×2
jquery ×1
knockback.js ×1
many-to-many ×1
marionette ×1
model ×1
requirejs ×1
tastypie ×1