经过另一个长时间的研究,sth出来了:-)似乎问题是关于函数"getObjectByName"。它不能很好地与requireJS(ADM)一起工作。目前,我必须设置一个全局变量来解决这个问题。我相信一定有更好的解决办法。
这是我的临时解决方案:
(1)设置全局变量,并将搜索模型范围设置为全局("APP")
var APP = {};
define(['backbone-relational'], function(){
Backbone.Relational.store.addModelScope(APP);
})
(2)将关系模型导出到全局
APP.YourRelationalModel = YourRelationModel;
它工作,虽然不是很好…我真的很期待一个更好的答案。谢谢。
//------------
测试版本: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
代码非常简单:(或参见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']
}
}
});
define(['backbone', 'backbone-relational'], function (Backbone) {
var Child = Backbone.RelationalModel.extend();
var Parent = Backbone.RelationalModel.extend({
relations : [
{
key : 'child',
type : Backbone.HasOne,
relatedModel : 'Child'
}
]
});
var test = new Parent();
});
将以上代码保存在main.js中,并包含在index.html中如下所示:
它不工作。有警告信息:
Relation=child: missing model, key or relatedModel (function (){ return parent.apply(this, arguments); }, "child", undefined).
我读了主干关系的源代码,知道名称空间有问题。relationship - backbone找不到在"Parent"中定义的relatedModel(即找不到relatedmode:"Child")。由于我对javascript的了解有限,我未能找到解决方案来解决这个问题:-)
有谁能帮我一下吗?在我提出问题之前,我研究了以下解决方案:
骨干。使用requireJs的关系模型
不能让主干关系与AMD一起工作(RequireJS)
加载骨干。关系型使用Use!插件
您不需要通过字符串引用relatedModel,您可以直接引用它,因此,代替relatedModel: 'Child'
,只需使用:relatedModel: Child
。
由于你使用的是requireJS,你可以很容易地从其他文件中引用模型。
define(['backbone', 'models/child', 'backbone-relational'], function (Backbone, Child) {
var Parent = Backbone.RelationalModel.extend({
relations : [{
key : 'child',
type : Backbone.HasOne,
relatedModel : Child
}]
});
var test = new Parent();
});
上述解决方案不适用于我。我逐渐将代码从Rails资产管道(不是RequireJS/AMD/CommonJS/任何东西)移到Webpack中,从依赖项开始。当我将需要backbone-relational
移动到Webpack bundle准备时,我的模型和关系定义仍然在Rails资产管道中,我开始得到很多无法解释的Relation=child: missing model, key or relatedModel (function (){ return parent.apply(this, arguments); }, "child", undefined).
在我的案例中,解决方案最终非常简单,尽管我花了很长时间才发现:
// In a Webpack module, later included into Rails Asset Pipeline
// temporarily to facilitate migration
require('expose?Backbone!backbone') // Exposing just for migration
require('backbone-relational')
Backbone.Relational.store.addModelScope(window)
backbone-relational
默认使用它的全局作用域来解析基于字符串的relatedModel
,但是由于它不需要真正的全局作用域,所以解决方案是简单地使用addModelScope
传递它,以便它可以搜索指定模型的作用域。