【问题标题】:How to make Backbone-Relational (0.8.5) work with RequireJS?如何使 Backbone-Relational (0.8.5) 与 RequireJS 一起工作?
【发布时间】:2016-11-18 11:49:53
【问题描述】:

经过长时间的研究,某事出来了 :-) 问题似乎与函数“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). 

我阅读了主干关系的源代码,知道命名空间有问题。 Relational-Backbone 找不到“Parent”中定义的relatedModel(即找不到releatedMode:“Child”)。由于我对 javascript 的了解有限,我未能找到解决此问题的解决方案 :-)

谁能帮我解决这个问题?

在我提出问题之前,我研究了以下解决方案:

Backbone.RelationalModel using requireJs
Can't get Backbone-relational to work with AMD (RequireJS)
Loading Backbone.Relational using Use! plugin

在这种情况下,它们都不起作用。

【问题讨论】:

  • 经过长时间的研究,某事出来了 :-) 问题似乎与函数“getObjectByName”有关。它不能很好地与 requireJS(ADM) 一起工作。目前,我必须设置一个全局变量来解决这个问题。我相信一定有更好的解决方案。这是我的临时解决方案:(1)设置一个全局变量并将搜索模型范围设置为全局(“APP”)var APP = {}; define(['backbone-relational'], function(){ Backbone.Relational.store.addModelScope(APP); }) (2)

标签: requirejs backbone-relational


【解决方案1】:

你不必通过字符串引用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();
});

【讨论】:

  • 非常感谢。有用。实际上,我曾尝试使用 Reference 一次,但我没有工作。现在弄清楚为什么那个时候它不起作用。这是由我在项目源代码中的另一个错误引起的:(
【解决方案2】:

上述解决方案不适用于我。从依赖关系开始,我逐渐将代码从 Rails 资产管道(不是 RequireJS/AMD/CommonJS/anything)移到 Webpack 中。当我通过我的模型将要求 backbone-relational 转移到 Webpack 包准备中并且关系定义仍在 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 默认使用其全局范围来解析基于字符串的relatedModels,但由于它需要没有 real 全局范围,因此解决方案只是使用 @987654326 传递它@ 所以它可以搜索指定模型的范围。

【讨论】:

    猜你喜欢
    • 2013-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-01
    • 1970-01-01
    • 2012-05-27
    相关资源
    最近更新 更多