backbone.js 带有require.js的多个小部件示例

gfttwv5a  于 2022-11-10  发布在  其他
关注(0)|答案(1)|浏览(125)

我们用backbone和require.js构建了一个widget应用程序。它可以在页面上运行一个应用程序示例。现在我们有了一个新的需求。我们需要在同一个页面上运行多个widget示例。每个应用程序都有自己的配置。
以下测试代码未按预期运行:

for(var i=0;i<3;i++){

    require([ "app" ], function(app) {
        var bootstrap = {};
        jQueryPB(function() {

            app.testData = i;
            app.startup();
        });
    });
}

我想知道如何示例化多个应用程序并为它们设置不同的配置?
项目结构类似于:
/main.js

require.config({
    ....
});

/*code to create multiple instances*/

      require(["app"], function(app){ 
    var instance = new app(color:"yellow"); 
    var instance2 = new app(color:"red"); 

       instance.render();
       instance2.render();
       /*want to create multiple instances here to same page*/
    })
/*above code is not working, TypeError: app is not a constructor*/

/app.js

define([ "jQueryPB", "backbone", "underscore", "models/app", "views/app" ], function($jpb,
        Backbone, _, appModel, appView) {

    var appInfo = new appModel();
    var app = new appView({
        model : appInfo
    });

    return app;
});

/models/app.js
/views/app.js
/view/bags.js
/view/bag(它通过var app = require(“app”)引用应用程序,以便可以访问app.color)
/收藏/箱包
/型号/包
我使用r.js将所有的js编译成一个
节点r.js -o build.js优化=无
在main.js完全下载后,它将开始初始化不同的应用程序示例。
更新代码
酷。2我用类似的方法试过了:
main.js

require(["app"], function(app){ 
var instance = new app({
        testData : 1
});
   instance.testData = "1"; 
   instance.startup();

})

app.js

define([ "jQueryPB", "backbone", "underscore", "models/app", "views/app" ], function($jpb,
        Backbone, _, appModel, appView) {

    return function app(color) {
        var appInfo = new appModel();
        var app = new appView({
            model : appInfo
        });
        console.log(">>"+color.testData);
        app.testData = color.testData;
        return app;
    };

});

bag.js中有一个问题,它需要访问应用程序中的自定义变量。(应用程序测试数据)但输出未定义。是否有其他方法可以访问应用程序示例?
此外,如果需要(“应用程序”),如果有多个应用程序示例,是否会导致问题?

rjee0c15

rjee0c151#

问题是,require是一个异步函数,不会立即执行,当它最终执行时,i的值将发生变化。最终,您将以所有示例共享相同的i值而告终,因为循环将在第一个require回调执行之前完成。See here
你可以通过在循环的每次迭代周围创建一个闭包来解决这个问题,这样i的原始值就保留在require回调函数的作用域中。

for (var i = 0; i < 3; i++) {
    (function (i) {
        require(["app"], function (app) {
          // etc  
        });
    })(i);
}

相关问题