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

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

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

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全局变量,并在以后的相关初始化方法中使用该变量。

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

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 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);
  }

});
票数 71
EN

Stack Overflow用户

发布于 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“是为这些类型的情况提供的特殊依赖项。

这是未经测试的,但从文档中看起来很确定。

票数 31
EN

Stack Overflow用户

发布于 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

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9916073

复制
相关文章

相似问题

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