2017-09-22 37 views
0

我想爲我的Ember應用程序構建一個新的條件助手。 需要注意的是,我使用的Ember 1.10.1使用了Handlebars 2.0,我無法升級它,這將很好的解決這個版本的Ember的問題。 在寫這裏之前,我嘗試了不同的解決方案並調試了Ember代碼,我靠近解決方案,但可能我錯過了一些東西。建立一個條件Ember幫手

首先,我試着用下面的方法讀取車把文檔:

Ember.Handlebars.registerHelper('helperName', function(conditional, options) { 
    if(conditional) { 
     return options.fn(this); 
    } else { 
     return options.inverse(this); 
    } 
}); 

而且這裏的模板:

{{#helperName booleanCondition}} 
    print true 
{{else}} 
    print false 
{{/helperName}} 

一切正常調用fn功能,但inversion功能(用於呈現else分支的模板)實際上是一個對象而不是一個函數。

然後,我開始調試灰燼代碼,我試圖遵循灰燼與if助手使用相同的方法,所以我結束了以下內容:

Ember.Handlebars.registerHelper('helperName', function(condition, options) { 

    var permission = Ember.Object.extend({ 
     can: Ember.computed(function() { 
      return condition; 
     }) 
    }).create(); 

    Ember.Handlebars.helpers.boundIf.helperFunction.call(this, ["can"], permission, options, options.data.buffer); 
}); 

can是,如果綁定屬性,因爲我們使用ifboundIf版本(這就是我剛纔所說的),所以用於更改模板,如果屬性更改。

該解決方案的問題是,該imho可能是最接近正確的是該屬性計算不正確,助手打印總是錯誤的值。 我調試了很多而沒有使其工作,所以任何幫助將非常感激,我希望這可能對其他人有用。

回答

0

好消息是你在Ember 1.10! 這意味着你有子表達式。而其簡單的創建一個結合的非塊幫手:

Ember.HTMLBars._registerHelper('foo', function(bar) { 
    return bar == 'bar'; 
}); 

要使用它作爲一個塊幫手與助手{{#if}}結合起來:

{{#if (foo model)}} 
    in if 
{{else}} 
    in else 
{{/if}} 
+0

試過,但我得到'TypeError:key.indexOf不是一個函數',除此之外,我想解決使用把手的問題而不是HTMLBars,但非常感謝您的回答! – AndreaScn

+0

你沒有把手。 Ember轉移到'1.10' AFAIK的HTMLBars。你從來都沒有!而你的錯誤沒有幫助。可能它或者是你的幫手或者代碼中的其他地方出了問題。我試過了上面的代碼。 – Lux

1

如果你想要做的是構建一個支持授權問題的條件方法,你應該看看ember-can。這是一個Ember-CLI插件(而它看起來像你在做全局變量),但舊版本使用Ember 1.10。你應該能夠引用他們在那裏做什麼,並在你的設置拉動它