2015-01-18 17 views
10

Tôi muốn chuyển một tham số mới vào một mẫu với bối cảnh dữ liệu gốc.Truyền tham số cho mẫu mà không cần ghi đè ngữ cảnh dữ liệu

  • gốc bối cảnh dữ liệu: {thông điệp: "hello"} {{> myTemplate withIcon=True}}
  • dữ liệu bối cảnh được overriden với {withIcon: True}

Acually giải pháp của tôi là để quấn dữ liệu như thế này.

<code> 
{{> myTemplate originalData=this withIcon=True}} 
</code> 

Có giải pháp nào tốt hơn không?

Trả lời

13

Bạn luôn có thể mở rộng bối cảnh hiện nay trong một helper:

Template.parentTemplate.helpers({ 
    iconContext: function() { 
    var result = _.clone(this); 
    result.withIcon = true; 
    return result; 
    } 
}); 

Và sử dụng nó như thế này:

<template name="parentTemplate"> 
    {{> myTemplate iconContext}} 
</template> 

Ngoài ra, bạn có thể tạo ra một helper chung chung hơn như thế này:

Template.registerHelper('extendContext', function(key, value) { 
    var result = _.clone(this); 
    result[key] = value; 
    return result; 
}); 

Sau đó chọn các cặp khóa/giá trị từ trong html của mẫu bất kỳ:

<template name="parentTemplate"> 
    {{> myTemplate extendContext 'withIcon' true}} 
    {{> myTemplate extendContext 'isAwesome' false}} 
</template> 

Hoặc là giải pháp mong muốn hơn là ẩn dữ liệu gốc trong một trường riêng biệt, vì nó giữ mẫu con chung chung.

+0

Bạn có thể xin hãy giải thích thêm một chút? Tại sao bạn phải làm _.clone (điều này)? – massimosgrelli

+0

Tại sao bạn không làm _.clone (điều này)? Điều gì sẽ xảy ra nếu tôi thêm kết quả vào ngữ cảnh dữ liệu con? Một cái gì đó như iconContext: function (childDataLikeMsgPost) {... childDataLikeMsgPost.withIcon = ...} Điều đó sẽ giúp tôi rất nhiều – massimosgrelli

7

xây dựng trên David's second option để cho phép nhiều thuộc tính:

<template name="parentTemplate"> 
    {{> myTemplate extendContext withIcon=true label="Has Icon" }} 
    {{> myTemplate extendContext withIcon=false label="No Icon" }} 
</template> 

và sau đó trong javascript:

Template.registerHelper('extendContext', function(data) { 
    var result = _.clone(this); 
    _.each(data.hash, function(value, key) { 
    result[key] = value; 
    }) 
    return result; 
}) 
+0

Điều này thực sự tốt đẹp. –

+2

Điều đó cũng hoạt động: 'return _.extend ({}, this, data.hash);' –

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