首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在使用AMD (require.js)时在Backbone.js中加载引导模型

如何在使用AMD (require.js)时在Backbone.js中加载引导模型
EN

Stack Overflow用户
提问于 2012-03-29 05:40:28
回答 8查看 26.5K关注 0票数 53

Backbone.js文档建议使用以下方式加载自举模型:

代码语言:javascript
复制
<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全局变量,并在以后的相关初始化方法中使用该变量。

有没有更好的方法(没有全局变量)来做这件事?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2012-04-24 05:27:28

这就是我们引导数据的方式,它不会污染全局命名空间。相反,它只使用require.js。它还可以帮助您根据模板中的变量提供初始应用配置。

在呈现的页面中

代码语言:javascript
复制
<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

此文件检查配置并使用返回的任何数据扩展自身

代码语言:javascript
复制
define([
  'config',
  'underscore'
], function(config) {

  var globals = {
  };
  _.extend(globals, config);
  return globals;

});

config.js

如果您希望能够加载应用程序,而不管您是否在页面中定义了config,则需要此文件。

代码语言:javascript
复制
define(function() {
  // empty array for cases where `config` is not defined in-page
  return {};
});

app.js

代码语言:javascript
复制
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);
  }

});
票数 71
EN

Stack Overflow用户

发布于 2013-02-20 04:34:46

在RequireJS中,这是通过requirejs.config()的配置选项完成的。然后,模块可以通过请求特殊的依赖“模块”并调用module.config()来读取该信息。示例:

index.html

代码语言:javascript
复制
<script>
  var require = {
    config: {
      'app': {
        'api_key': '0123456789-abc'
      }
    }
  };
</script>
<script src="js/libs/require.js" data-main="js/main"></script>

main.js

代码语言:javascript
复制
require( ['app'], function(App) {
  new App();
});

app.js

代码语言:javascript
复制
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

票数 11
EN

Stack Overflow用户

发布于 2012-10-31 22:32:29

这里的一些答案让我接近了类似的问题,但没有什么能解决它。特别是,排名靠前并被接受的答案似乎给了我一个令人讨厌的竞争条件,有时虚拟对象将首先加载。当与优化器一起使用时,这也会发生100%的情况。它还对模块使用显式的字符串名称,而require文档特别建议您不要这样做。

这就是我的工作方式。与Brave Dave类似,我使用config对象来捕获参数(在我的示例中,参数来自jsp页面),如下所示

代码语言:javascript
复制
<script type="text/javascript">
    var require = {
        config: {
            options : { 
                bootstrappedModels : ${models}
            }
        }
    }
</script>

特别要注意的是,我的参数在一个名为options的对象中。

代码语言:javascript
复制
config: function () {
    return (config.config && config.config[mod.map.id]) || {};
},

关键的一点是,配置对象上必须有属性,关键字为mod.map.id,它可以解析为“options”。

您现在可以从这里访问模型,如下所示

代码语言:javascript
复制
define(['module'], function(module){
    console.log(module.config().bootstrappedModels);
    //...
});
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9916073

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档