Javascript 如何在NodeJS中为Browserify';获取当前文件夹;依赖于另一个文件夹中的基文件的d文件?

Javascript 如何在NodeJS中为Browserify';获取当前文件夹;依赖于另一个文件夹中的基文件的d文件?,javascript,node.js,ampersand,ampersand.js,Javascript,Node.js,Ampersand,Ampersand.js,我使用的是AmpersandJS,我试图模拟Ember的pod结构,这样,就可以代替每种类型结构的典型文件夹: app |-- views |-- index.js |-- login.js |-- people.js |-- templates |-- index.jade |-- login.jade |-- people.jade 每个组件都有文件夹: app |-- index |-- view.js |-- templa

我使用的是AmpersandJS,我试图模拟Ember的pod结构,这样,就可以代替每种类型结构的典型文件夹:

app
|-- views
    |-- index.js
    |-- login.js
    |-- people.js
|-- templates
    |-- index.jade
    |-- login.jade
    |-- people.jade
每个组件都有文件夹:

app
|-- index
    |-- view.js
    |-- template.jade
|-- login
    |-- view.js
    |-- template.jade
|-- people
    |-- view.js
    |-- template.jade
|-- base-view.js
我正在使用templatizer编译我的模板:

templatizer(__dirname + '/app', __dirname + '/app/templates.js');
这将使模板对象看起来像这样(为了便于解释而简化):

在我的其他视图中,我扩展了基本视图:

// in app/index/view.js:
var IndexView = BaseView.extend({ ... });
我遇到的问题是,当基本视图通过Browserify时,
\uu dirname
被设置为基本视图模板的文件夹,而不是扩展它的视图。因此,
\uu dirname
将始终是
/app
,即使正在渲染的视图是
/app/index/view.js


我想知道是否有可能获得当前视图而不是基本视图的名称。我知道我可以向基本视图将要读取的每个视图添加类似于
templatePath的内容,但我正试图避免这样做。

因此我认为这归结为javascript范围问题。您需要从每个子类视图的作用域中获取
\uuu dirname
,并将其固定到实例上,以便覆盖正常工作。有几种方法可以实现这一点(我不熟悉Ampersand state
extend
),但我的第一个建议是:

var IndexView = BaseView.extend({props: {__dirname: __dirname}});
这将在正确的范围内获取
\uuuu dirname
,并使其可用。然后,您需要实现BaseView模板函数,该函数引用
this.\uu dirname
,而不仅仅是
\uu dirname

var BaseView = AmpersandView.extend({
  template: function() {
    // pretend that I'm cleaning up __dirname here
    return templates[this.__dirname].template;
  }
});

谢谢你的回答!这绝对是一个范围问题;Browserify将通过如下操作转换JS:
(函数(dirname){…})。调用(this,'/app')
。因为在这一点上它是“硬编码”的,所以让dirname正常工作的唯一方法是从子类传递它。仅供参考,这不是browserify本身的函数。这就是node.js实现CommonJS约定的方式。每个模块都封装在一个函数体中,其中CommonJS详细信息作为参数提供。Browserify只是确保浏览器中也可以使用这些功能。
var IndexView = BaseView.extend({props: {__dirname: __dirname}});
var BaseView = AmpersandView.extend({
  template: function() {
    // pretend that I'm cleaning up __dirname here
    return templates[this.__dirname].template;
  }
});