2017-09-22 3 views
0

Ich versuche, einen neuen bedingten Helfer für meine Ember-Anwendung zu erstellen. Ist wichtig zu erwähnen, dass ich Ember 1.10.1 benutze, das Lenker 2.0 benutzt und ich kann es nicht aufrüsten, wäre großartig, das Problem mit dieser Version von Ember zu lösen. Bevor ich hier geschrieben habe, habe ich verschiedene Lösungen ausprobiert und den Ember-Code stark debugged. Ich bin der Lösung nahe, aber wahrscheinlich fehlt mir etwas.Erstellen eines bedingten Ember-Helfers

Zunächst einmal habe ich versucht, mit den folgenden Ansatz des Lenkers Dokumentation zu lesen:

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

Und hier die Vorlage:

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

Alles hat gut funktioniert die fn Funktion aufrufen, sondern die inversion Funktion (verwendet, um die Vorlage der Else-Zweig zu rendern) war eigentlich ein Objekt anstelle einer Funktion.

Dann begann ich den Code Ember Debuggen und ich versuchte, den gleichen Ansatz zu folgen, die Ember mit dem if Helfer verwendet, so landete ich mit dem Follow-up:

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 Eigentum ist an die gebunden, wenn , verwendet, um die Vorlage zu ändern, wenn sich die Eigenschaft ändert, da wir die boundIf Version der if verwenden (das tut, was ich gerade gesagt habe).

Das Problem dieser Lösung, die imho könnte am nächsten sein, um korrekt zu sein, ist, dass die Eigenschaft nicht korrekt berechnet wird und der Helfer immer den falschen Wert druckt. Ich debuggte wirklich sehr viel, ohne es zu arbeiten, so dass jede Hilfe sehr geschätzt würde und ich hoffe, dass dies für jemand anderen auch nützlich sein könnte.

Antwort

0

Die gute Nachricht ist, Sie sind auf Ember 1.10! Dies bedeutet, dass Sie Teilausdrücke haben. Und seine einfach, einen gebundenen Nicht-Block Helfer zu erstellen:

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

Um es als Block Helfer verwenden Sie es kombinieren mit dem {{#if}} Helfer:

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

Versucht, aber ich bekomme 'TypeError: key.indexOf ist keine Funktion', abgesehen davon, möchte ich das Problem mit Lenker zu lösen und nicht HTMLBars, aber vielen Dank für Ihre Antwort! – AndreaScn

+0

Sie haben keinen Lenker. Ember wechselte in '1.10' AFAIK zu HTMLBars. Du hast nie beides! Und dein Fehler ist nicht hilfreich. Wahrscheinlich ist es entweder etwas falsch mit Ihrem Helfer oder irgendwo anders in Ihrem Code. Ich habe den obigen Code ausprobiert. – Lux

1

Wenn das, was Sie versuchen zu tun, bauen ein bedingter Ansatz, der Autorisierungsfragen unterstützt, sollten Sie einen Blick auf ember-can werfen. Es ist ein Ember-CLI-Addon (obwohl es so aussieht, als würdest du Globals machen), aber ältere Versionen arbeiteten mit Ember 1.10. Sie sollten in der Lage sein zu verweisen, was sie dort tun und ziehen Sie es auf Ihrem Setup

Verwandte Themen