如何在已加载的Javascript / Backbone中再次调用模块

时间:2016-08-08 16:17:44

标签: javascript html backbone.js requirejs

我是Javascript / backboneJS / RequireJS的新手。为了渲染我的前端,我制作了一个控制器,一个模型和一个视图。另外,我的html文件中有一个下拉列表。

所以到目前为止,我所做的是在我的文件中的

 require(['common'],function()
    {
      require(['jquery','fastclick','nprogress','charts','underscore','spinner'],function()
      {
        require(['firstDashboardController']);
      });
    });

所以我正在加载" firstDashboardController"并且该控制器相应地加载所有模块并在前端显示数据。所以一切正常。

现在我在前端有一个下拉列表。当我选择下拉列表时,根据所选的id我想要检索数据。所以我需要调用" firstDashboardController"再次,以便根据我所获得的新ID呈现所有内容。

那我该怎么办?就像我需要UN-REQUIRE我的" firstDashboardController"然后再次要求它传递新的id。因为控制器已经通过Require beacuse加载,所以我将其加载到我的HTML文件中,如上所述。但我需要按照通过下拉菜单选择的新ID再次加载它。那怎么去呢?请帮助我。如果需要任何代码片段,我可以把它。

代码段:

我的控制器:

define(['backbone', 'firstSubViewModel','dropdownViewModel', 'dropdownModel'],
  function(Backbone, firstSubViewModel,  dropdownViewModel, dropdownModel) {

      var ch = new dashboardModel.chart({});
        if (localStorage.getItem('p_kt') && localStorage.getItem('p_acid') && localStorage.getItem('p_seid')) {
          var data = {
            tokenProp: localStorage.getItem('p_kt'),
            accountIdProp: localStorage.getItem('p_acid'),
            sessionIdProp: localStorage.getItem('p_seid')
          };
          $.when(
            ch.fetch(data) // GETTING DATA FROM MODEL VIA AJAX CALL in my model.JS

          ).then(function() {
            // Main Graph on Dashboard
            new firstSubViewModel({
              el: '#chartAnchor1',
              model: ch
            });
    });});

我不知何故需要再次致电ch.fetch()

1 个答案:

答案 0 :(得分:1)

您没有正确定义控制器。您目前将它作为一次性设置方法而不是稍后可以重新运行的方法。让我们一步一步走。

myLife.js:

define([], function() {
  return "a complex series of failures";
});

通过返回来自define回调的值,这定义了我需要" myLife"然后它将提供"一系列复杂的失败& #34;在回调函数中。这就是Backbone和其他AMD模块在代码块中出现的情况。但是,它只运行一次内容;并保存结果。所以,这不会起作用:

incrementer.js:

var x = 0;
define([], function() {
  x = x + 1;
  return x;
});

(试图要求增量器总是给你" 1"。)

您要做的是返回功能 - 您可以随时重新运行。

incrementerV2.js:

define([], function() {
  var x = 0;
  return function() {
    x = x + 1;
    return x;
  };
});

在任何文件中,您都可以拥有:

require(['incrementerV2'], function(myIncr) {
  myIncr(); // 1
  myIncr(); // 2
});

...而且,为了记录,我建议尽可能在任何给定文件中只有一个require语句。如果加载顺序很重要,您可以在第一个参数数组中添加依赖项。

更常见的是,人们将有一个模块包含一个自定义对象,其中包含多个函数,而不是我上面给出的函数。返回然后只使用一个函数也是有效的,具体取决于用例。任何变量类型都有效,但只要记住,只要你以后需要它,它将始终是唯一的变量。

加载订单

当系统检索上面的myLife.js或incrementer.js时,在实际运行我们定义的定义函数之前,还有一个中间步骤。它将查看第一个参数,即命名依赖项的数组,并确定在运行给定函数之前是否还需要依赖项。例如:

a.js: require(['b', 'c'], function(b, c) {
b.js: define(['c'], function(c) {
c.js: define([], function() {

首先请求a.js,但不运行因为它需要B和C. B接下来加载,但由于未加载C而被忽略。 C运行,然后将其返回值传递到A和B.此系统内部非常智能,并且永远不应该请求相同的文件两次,或者如果一个文件在另一个文件之前加载则会发生冲突。您可以像使用Java中的导入一样使用它。

另外,我们假设您只在'c'中添加了a.js,以便b.js不会崩溃,因为它需要先加载 - 在这种情况下,把它从A中拿出来它应该也一样。

    a.js: require(['b'], function(b) {

就像A一样,B会在执行任何操作之前自动加载所有依赖项。一个简单的原则是只引用一个依赖项,如果它实际上直接在文件中引用(或定义了必要的全局变量)