0

这个问题的一些背景信息

所以我去年为一个客户写了一个应用程序,大约在项目进行到一半时,我意识到我需要有很多异步功能,所以我开始编写将很多网站功能转移到 javascript。我的开发环境遇到了一个相当大的问题,最终我的 php 文件中有很多我的 javascript,只是为了节省时间。

在将项目移交给客户之前,我将所有 javascript 移动到单独的文件中,这些文件仅由站点的不同区域分开。所以我最终得到了一个 admin.js、checkout.js、common.js 等。

实际问题

客户现在想要为站点添加更多功能,我想继续将 javascript 正确地构建到不同的文件中,并将模型代码与视图代码分开。

我想使用 requirejs,这样我就不会在每个页面的页脚中都有一堆脚本调用,并且也可以更好地处理依赖关系。

我遇到的具体问题是它似乎没有正确加载我的文件。

我的 main.js 文件

require.config({
  paths: {
    'course'    : 'models/course',
    'login_view': 'views/login/login_view',
    'config'    : 'config',
    'views'     : 'views/views',
    'session'   : 'models/session'
  }
});

require(['login_view'], function(login_view){
  login_view.init();
});

我的 login_view.js 文件

define(function() {
  var login_view = {
    init: function(){
      console.log(this);
    });
  };
});

当我在开发服务器上加载应用程序时,出现此错误,Uncaught TypeError: Cannot call method 'init' of undefined

任何帮助,将不胜感激。

4

1 回答 1

2

因为模块必须公开一个需要模块可以操作的接口(替换变量名称以避免命名混淆):

//login_view.js
define(function() {
  var opBoard = {
    init: function(){
      console.log('I am initted!');
    });
  };

  //expose opBoard containing init
  return opBoard;
});

//so if i required in require or depended in another module
require(['login_view'],function(lv){
  //lv is the exposed opBoard from the `login_view` module
  lv.init();
});
于 2013-01-11T18:46:56.537 回答