Javascript 如何在NodeJS中为Browserify';获取当前文件夹;依赖于另一个文件夹中的基文件的d文件?
我使用的是AmpersandJS,我试图模拟Ember的pod结构,这样,就可以代替每种类型结构的典型文件夹: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
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 stateextend
),但我的第一个建议是:
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;
}
});