2017-08-11 72 views
2

我正在开发带有流星火焰的Web组件。如何在JavaScript助手中只声明一次变量?

在模板助手,

Template.Button.helpers({ 
btnName: function() { 
    var FirstBtn = new ButtonComponents('Name', this.class, '50px', '30px', '#DDDDDD'); 
    return FirstBtn.buttonName(); 
}, 
btnClass: function() { 
    var FirstBtn = new ButtonComponents('Name', this.class, '50px', '30px', '#DDDDDD'); 
    return FirstBtn.buttonClass(); 
}, 
btnStyle: function() { 
    var FirstBtn = new ButtonComponents('Name', this.class, '50px', '30px', '#DDDDDD'); 
    return FirstBtn.buttonStyle(); 
}}); 

我要声明FirstBtn在助手一次。

由于this.class,我不想在帮助者之外声明FirstBtn

我该怎么做?

+0

为什么'this.class'阻止你在外部范围声明'FirstBtn'? – 4castle

+0

它可能与自引用对象有关 https://stackoverflow.com/questions/4616202/self-references-in-object-literal-declarations – brk

+0

因为我在数据上下文中使用包含标签(部分)。 '{{> Button class =“btn black”}}' – HyeonggeunYun

回答

3
var FirstBtn; 
function getFirstBtn(cls) { 
    if (FirstBtn == null) { 
     FirstBtn = new ButtonComponents('Name', cls, '50px', '30px', '#DDDDDD'); 
    } 
    return FirstBtn; 
} 

Template.Button.helpers({ 
    btnName: function() { 
     return getFirstBtn(this.class).buttonName(); 
    }, 
    btnClass: function() { 
     return getFirstBtn(this.class).buttonClass(); 
    }, 
    btnStyle: function() { 
     return getFirstBtn(this.class).buttonStyle(); 
    } 
}); 

补充:我强烈建议您在onCreated创建此按钮,并将其存储在模板实例本身。您可以稍后从助手这样引用它:例如,Template.instance().FirstBtn.buttonName()

+0

谢谢!它工作得很好。我会调整你的'增加'建议! – HyeonggeunYun

+0

对不起,但我还有一个问题。当我在'onCreated'中创建buttion时,如何添加'this.class'?在'onCreated'中,我不能使用'this.class',但是,我只能在'helpers'中使用'this.class' – HyeonggeunYun

+0

使用'this.data.class' – Styx

0

你应该把你的变量放在Template实例中,并用Template.instance()来访问它。

Template.Button.onCreated(function(){ 
    this.FirstBtn = new ButtonComponents('Name', this.data.class, '50px', '30px', '#DDDDDD'); 
}); 

Template.Button.helpers({ 
btnName: function() { 
    const instance = Template.instance(); 

    return instance.FirstBtn.buttonName(); 
}, 
btnClass: function() { 
    const instance = Template.instance(); 

    return instance.FirstBtn.buttonClass(); 
}, 
btnStyle: function() { 
    const instance = Template.instance(); 

    return instance.FirstBtn.buttonStyle(); 
}}); 

在助手的第一行写const instance = Template.instance();是由BlazeJS文档建议一个很好的做法。