2013-06-28 26 views
23

Có phương pháp tích hợp nào để truy cập ngữ cảnh gốc trong mẫu Handlebars.js không? Hầu hết những người trợ giúp đang thêm ngữ cảnh lồng nhau và bạn phải viết ../ trước biến trong ngữ cảnh đó để truy cập nó nhưng điều đó không thực tế lắm nếu bạn có rất nhiều mỗi, nếu, v.v.Truy cập vào ngữ cảnh gốc trong mẫu Handlebar.js

Trả lời

42

Sử dụng @root. Đây là trong handlebars-v2.0.0.js

{{@root.somthing.nested_somthing}} 
+1

Bạn cũng có thể sử dụng @root trong các khối 'if' và' each', ví dụ: '{{#each @ root.somthing.nested_somthing}}' – user393274

+0

Cảm ơn bạn đã chỉ ra phiên bản, nơi nó được giới thiệu. Chúng tôi đã thất bại cho đến khi chúng tôi nhận ra rằng chúng tôi đã làm việc với handlebars-v.1.3.0.js –

0

Không phải là chưa!

Nó đã được đề nghị một vài lần và có một vé mở: https://github.com/wycats/handlebars.js/issues/392

Lập luận của họ là không bắt buộc nhưng nếu nó là một sửa chữa giá rẻ không có chi phí hiệu quả thấy rõ tôi không thấy lý do tại sao nó không thể được bao gồm.

2

Vâng, tôi đã tạo ra một thấy http://www.my2ndgeneration.com/TemplateLanguageDoc.aspx#xroot

Về cơ bản, thêm helper này và bingo {{xRoot}} sẽ đưa bạn đến đỉnh ...

tôi luôn truyền dữ liệu JSON của tôi vào tay lái như này:

{ data: self.data } 

do đó mã dưới đây luôn trả về "dữ liệu" khi nó thấy thẻ xRoot và đưa tôi lên đỉnh

Handlebars.JavaScriptCompiler.prototype.nameLookup = function (parent, name, type) { 

    if (name.indexOf("xRoot") === 0) { 
     return "data"; 
    } 

    if (/^[0-9]+$/.test(name)) { 
     return parent + "[" + name + "]"; 
    } else if (Handlebars.JavaScriptCompiler.isValidJavaScriptVariableName(name)) { 
     return parent + "." + name; 
    } 
    else { 
     return parent + "['" + name + "']"; 
    } 
}; 
6

không có khả năng truy cập ngữ cảnh gốc của mẫu khi bạn thay đổi ngữ cảnh bằng tính năng lặp (ví dụ: mỗi) more info

Tuy nhiên có một khả năng truy cập vào bối cảnh trước đó với '../'

# app/assets/javascript/contents.coffee 
body = HandlebarsTemplates['my_hbs_template']({ 
    view:{ 
    registryName: 'foo', 
    data: {items: {x: 'x'}} 
    } 
    }) 

mẫu:

<!-- app/assets/javascript/templates/my_content.hbs --> 
<table class="table"> 
    <tbody> 

    {{#each view.data.items}} 
    <tr> 
     <td>{{@key}}</td> 
     <td> 
     Hello from {{../view.registryName}} 
     </td> 
    </tr> 
    {{/each}} 
    </tbody> 
</table> 

séc http://handlebarsjs.com/#paths để biết thêm

Các vấn đề liên quan