2015-04-29 4 views
0

Я использую AmpersandJS и я пытаюсь подражать стручок структуру Эмбер так, что, вместо типичных папок-на-типа структуры:Как получить текущую папку в NodeJS для файла Browserify'd, который опирается на базовый файл в другой папке?

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'); 

который сделает объект шаблона выглядеть примерно так (упрощенно ради объяснения):

{ 
    "index.template": "<div>index</div>", 
    "login.template": "<div>login</div>", 
    "people.template": "<div>people</div>" 
} 

В базовой точке зрения, я следующий, который будет возвращать шаблон по соглашению:

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

и в других моих взглядах, я продлевая вид базы:

// in app/index/view.js: 
var IndexView = BaseView.extend({ ... }); 

проблема я бегу в том, что, когда базовая точка зрения проходит через Browserify, __dirname устанавливается в папку шаблона базового вида, а не вид, который простирающуюся I т. В результате __dirname всегда будет /app, хотя /app/index/view.js - вид, который отображается.

Мне было интересно, возможно ли получить имя dirname текущего вида, а не базовый вид. Я знаю, что я могу добавить что-то вроде templatePath для каждого представления, которое будет читать базовый вид, но я стараюсь не делать этого.

ответ

0

Так что я думаю, что это сводится к проблеме с областью javascript. Вам нужно будет захватить __dirname из области видимости каждого подкласса и привязать его к экземпляру, чтобы переопределение работало должным образом. Есть несколько способов достижения этой цели (и я не знаком с амперсандом состоянием extend), но мое первое предложение было бы:

var IndexView = BaseView.extend({props: {__dirname: __dirname}}); 

Это будет захватывать __dirname в правильном объеме и сделать его доступным. Затем вам нужно реализовать свою функцию шаблона BaseView, ссылаясь на this.__dirname вместо __dirname.

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

Спасибо за ответ! Это определенно проблема; Browserify преобразует JS, выполняя что-то вроде: '(function (dirname) {...}). Call (this, '/ app')'. Поскольку на данный момент это «жестко закодировано», единственный способ заставить dirname работать правильно - это передать его из подкласса. –

+0

FYI это не функция браузера. Вот как node.js реализует соглашения CommonJS. Каждый модуль завернут в тело функции с данными CommonJS, представленными в качестве аргументов. [точную информацию здесь] (https://github.com/joyent/node/blob/4d9c81b7e2522c5d5d9d35058cbb0bce1228d360/src/node.js#L799). Browserify просто гарантирует, что они также доступны в браузере. –