Backbone.js文档建议使用以下方式加载自举模型:
<script>
var Accounts = new Backbone.Collection;
Accounts.reset(<%= @accounts.to_json %>);
var Projects = new Backbone.Collection;
Projects.reset(<%= @projects.to_json(:collaborators => true) %>);
</script>
但这是一种不能在AMD方法(使用require.js)中使用的模式
唯一可能的解决方案是声明存储数据的JSON全局变量,并在以后的相关初始化方法中使用该变量。
有没有更好的方法(没有全局变量)来做这件事?
发布于 2012-04-24 05:27:28
这就是我们引导数据的方式,它不会污染全局命名空间。相反,它只使用require.js。它还可以帮助您根据模板中的变量提供初始应用配置。
在呈现的页面中
<script src="require.js"></script>
<script>
define('config', function() {
return {
bootstrappedAccounts: <%= @accounts.to_json %>,
bootstrappedProjects: <%= @projects.to_json(:collaborators => true) %>
};
});
</script>
<script src="app.js"></script>
globals.js
此文件检查配置并使用返回的任何数据扩展自身
define([
'config',
'underscore'
], function(config) {
var globals = {
};
_.extend(globals, config);
return globals;
});
config.js
如果您希望能够加载应用程序,而不管您是否在页面中定义了config
,则需要此文件。
define(function() {
// empty array for cases where `config` is not defined in-page
return {};
});
app.js
require([
'globals',
'underscore',
'backbone'
], function(globals) {
if (globals.bootstrappedAccounts) {
var accounts = new Backbone.Collection(globals.bootstrappedAccounts);
}
if (globals.bootstrappedProjects) {
var projects = new Backbone.Collection(globals.bootstrappedProjects);
}
});
发布于 2012-10-21 08:13:02
看起来您可以使用require.config()函数或带有"config“选项的"require”全局函数,以便通过特殊的依赖“模块”将数据传递给模块。请参阅http://requirejs.org/docs/api.html#config-moduleconfig
通常需要将配置信息传递给模块。这些配置信息通常被认为是应用程序的一部分,需要有一种方法将其传递给模块。在RequireJS中,这是通过requirejs.config()的配置选项完成的。然后,模块可以通过请求特殊的依赖“模块”并调用module.config()来读取该信息。
因此,对于bootstrapping模型,在顶级HTML页面中:
<script>
var require = {
config: {
'app': {
bootstrappedAccounts: <%= @accounts.to_json %>
bootstrappedProjects: <%= @projects.to_json(:collaborators => true) %>
}
}
};
</script>
<script src="scripts/require.js"></script>
然后在应用程序模块(app.js)中,我们有:
define(['module'], function (module) {
var accounts = new Backbone.Collection( module.config().bootstrappedAccounts );
var bootstrappedProjects = new Backbone.Collection( module.config().bootstrappedProjects );
});
这里的"module“是为这些类型的情况提供的特殊依赖项。
这是未经测试的,但从文档中看起来很确定。
发布于 2013-02-20 04:34:46
在RequireJS中,这是通过requirejs.config()
的配置选项完成的。然后,模块可以通过请求特殊的依赖“模块”并调用module.config()
来读取该信息。示例:
index.html
<script>
var require = {
config: {
'app': {
'api_key': '0123456789-abc'
}
}
};
</script>
<script src="js/libs/require.js" data-main="js/main"></script>
main.js
require( ['app'], function(App) {
new App();
});
app.js
define( ['module'], function(module) {
var App = function() {
console.log( 'API Key:', module.config().api_key );
};
return App;
});
只需注意,配置对象的名称必须与模块的名称匹配。在我的示例中,模块的名称是app
,因此配置对象的名称也需要命名为app
。在该模块中,您需要包含['module']
作为依赖项,并调用module.config()[property name]
来检索配置数据。
阅读与此相关的文档:http://requirejs.org/docs/api.html#config-moduleconfig
https://stackoverflow.com/questions/9916073
复制相似问题