2015-03-31 58 views
2

我有一個輔助功能正從一個對象的屬性(從計算器樣本轉換)時,做錯誤檢查:{{#if}}是否會影響上下文?

module.exports.register = function (Handlebars, options) { 

    Handlebars.registerHelper('get', function (obj, prop, context) { 
    if (typeof obj !== 'object') { 
     throw new Error('get: Cannot get from ' + typeof obj); 
    } 

    if (typeof prop !== 'string') { 
     throw new Error('get: Property must be a string. Type ' + typeof prop + ' not supported'); 
    } 

    if (!obj.hasOwnProperty(prop)) { 
     throw new Error('get: Object does not contain the property "' + prop + '"'); 
    } 

    return obj[prop]; 
    }); 
} 

當我使用這通常只是正常工作:

<div> 
    {{get ../site.sectionNames tag}} 
</div> 

...但是,如果我把它放在一個{{#if true}}元素中,然後obj未定義:

<div> 
    {{#if true}} 
    {{get ../site.sectionNames tag}} 
    {{/if}} 
</div> 

我的印象是{{#if}}doesn't change the context這是怎麼發生的?

+0

這似乎是預期的行爲:https://github.com/wycats/handlebars。 JS /問題/ 196。 – 2015-04-10 21:52:05

+0

謝謝,我添加了一條評論,看看我能否弄清楚爲什麼會發生這種情況。似乎直接與文檔衝突... – jt000 2015-04-11 14:01:28

回答

1

請考慮以下示例。
..

上下文:

{ 
    id: 1, 
    items: ['a', 'b'] 
} 

模板1:

{{#each items}} 
    <div>outer: {{../id}}</div> 
    {{#if ../id}} 
    <div>inner: {{../id}}</div> 
    {{/if}} 
{{/each}} 

輸出:

outer: 1 
inner: 
outer: 1 
inner: 

模板2: - (無外#each塊)

<div>outer: {{id}}</div> 
{{#if id}} 
    <div>inner: {{id}}</div> 
{{/if}} 

輸出:

outer: 1 
inner: 1 

所以,我認爲這是#each這產生這種不一致。

../爲我們提供了當前塊之外的上下文,而不是JSON中的父上下文。而對於#if區塊,內部和外部的上下文可能相同也可能不相同。

因此,爲了保持一致並避免混淆,我們應該始終添加../來指向#if塊中的值。
例如,

{{#if id}} 
    {{../id}} 
{{/if}} 
1

塊創建新的上下文。所以 - 內部{{#if}}{{#each}}的上下文中 - 而不是根上下文。

換句話說,你可以使用:

{{#each items}} 
    <div>outer: {{../id}}</div> 
    {{#if ../id}} 
     <div>inner: {{../../id}}</div> 
    {{/if}} 
{{/each}} 

您也可以嘗試@root

{{#each items}} 
    <div>outer: {{ @root.id}}</div> 
    {{#if @root.id}} 
     <div>inner: {{ @root.id}}</div> 
    {{/if}} 
{{/each}}