Zum Inhalt springen

Backbone.js

aus Wikipedia, der freien Enzyklopädie
{{#if: Backbone.js | Backbone.js | {{#invoke:WLink|getArticleBase}} }}

{{#if: Datei:Backbone.js logo.svg |

colspan="2" class="notheme" style="text-align:center; background:#Vorlage:Standardfarbe; color:#202122;" | Datei:Backbone.js logo.svg |
 {{#if: {{#invoke:Wikidata|claim|P154}} | 
[[Datei:{{#invoke:Wikidata|claim|P154}}|150px]]
 }}

}}{{#if: |

{{#if: |
}}|

}}

Basisdaten

{{#if: |

Hauptentwickler
 {{#if: {{#invoke:Wikidata|claim|P126}} | 
Maintainer claim|P126|parameter=link|references=ja|list=, }}
 }}

}}{{#if: Jeremy Ashkenas |

Entwickler Jeremy Ashkenas |
 {{#if: {{#invoke:Wikidata|claim|P178}} | 
Entwickler claim|P178|parameter=link|references=ja|list=, }}
 }}

}}{{#if: 13. Oktober 2010<ref name="changelog">Change Log</ref> |

Erscheinungsjahr
 {{#if: {{#invoke:Wikidata|claim|P577}} | 
Erscheinungsjahr claim|P577|references=ja|list=, }} |
   {{#if: {{#invoke:Wikidata|claim|P571}} | 
Erscheinungsjahr claim|P571|references=ja|list=, }}
   }}
 }}

}}{{#ifeq: | KEINE_ANGABE || {{#if: |

Aktuelle Version
({{#if: | Vorlage:Datum – die Form mit drei unbenannten Parametern oder anderen einzelnen Zeiteinheiten ist veraltet und wird nicht mehr unterstützt. Bitte gib das Datum einfach im Klartext an.
format | {{#timefl:now|date}}}} {{{2}}} | T._Monat JJJJ}} lang= {{#switch: -|=de #default=de-AT
            }}
   }}

}}) }}

 {{#if: {{#invoke:Wikidata|claim|P348|P548|!Q3295609,Q51930650,Q2122918,Q21727724,Q1072356,Q6736813}} | 
Aktuelle Version claim|P348|P548|!Q3295609,Q51930650,Q2122918,Q21727724,Q1072356,Q6736813|references=ja}} {{#if: {{#invoke:Wikidata|claim|P348|P548|!Q3295609,Q51930650,Q2122918,Q21727724,Q1072356,Q6736813|qualifier=P577}} |
({{#invoke:Wikidata|claim|P348|P548|!Q3295609,Q51930650,Q2122918,Q21727724,Q1072356,Q6736813|qualifier=P577}}) }}}}}}

}}{{#ifeq: | KEINE_ANGABE || {{#if: |

Aktuelle Vorabversion
({{#if: | Vorlage:Datum – die Form mit drei unbenannten Parametern oder anderen einzelnen Zeiteinheiten ist veraltet und wird nicht mehr unterstützt. Bitte gib das Datum einfach im Klartext an.
format | {{#timefl:now|date}}}} {{{2}}} | T._Monat JJJJ}} lang= {{#switch: -|=de #default=de-AT
            }}
   }}

}}) }}

 {{#if: {{#invoke:Wikidata|claim|P348|P548|Q1072356,Q51930650,Q3295609,Q2122918,Q21727724}} | 
Aktuelle Vorabversion claim|P348|P548|Q1072356,Q51930650,Q3295609,Q2122918,Q21727724|references=ja}} {{#if: {{#invoke:Wikidata|claim|P348|P548|Q1072356,Q51930650,Q3295609,Q2122918,Q21727724|qualifier=P577}} |
({{#invoke:Wikidata|claim|P348|P548|Q1072356,Q51930650,Q3295609,Q2122918,Q21727724|qualifier=P577}}) }}}}}}

}}{{#if: |

Ausführungsumgebung
 {{#if: plattformunabhängig | 
Betriebssystem plattformunabhängig |
   {{#if: {{#invoke:Wikidata|claim|P306}} | 
Betriebssystem claim|P306|parameter=link|references=ja|list=, }}
   }}
 }}

}}{{#if: JavaScript |

Programmier­sprache JavaScript |
 {{#if: {{#invoke:Wikidata|claim|P277}} | 
Programmier­sprache claim|P277|parameter=link|references=ja|list=, }}
 }}

}}{{#if: JavaScript-Bibliothek |

Kategorie JavaScript-Bibliothek

}}{{#if: MIT-Lizenz (Freie Software) |

Lizenz MIT-Lizenz (Freie Software) |
 {{#if: {{#invoke:Wikidata|claim|P275}} | 
Lizenz claim|P275|parameter=link|references=ja|list=, }}
 }}

}}{{#if: nein |

deutschsprachig faculty|nein}} | ja | nein }}

}}{{#if: |

Sonstiges {{{Sonstiges}}}Vorlage:Infobox Software/Wartung/Sonstiges

}}{{#if: backbonejs.org |

backbonejs.org |
 {{#if: {{#invoke:Wikidata|claim|P856|notdeprecated=1}} | 
{{#invoke: WLink | formatURL | {{#invoke:Wikidata|claim|P856|parameter=link|notdeprecated=1}}}}
 }}

}}{{#if: |

Dateien [[c:Category:Created with |]]

}}

Backbone.js ist eine JavaScript-Bibliothek mit RESTful-JSON-Schnittstelle. Backbone basiert auf dem Model-View-Controller-Muster (MVC). Backbone ist für seine geringe Größe bekannt und nur von der JavaScript-Bibliothek<ref>{{#invoke:Vorlage:Literatur|f}}</ref> Underscore.js abhängig. Backbone wird zur Programmierung von Single-Page-Webanwendungen und zur Synchronität von Webanwendungen (z. B. verschiedene Clients und Server) verwendet. Backbone wurde von Jeremy Ashkenas geschaffen, der ebenso der initiale Autor von CoffeeScript ist.

Architekturvorgaben

Datei:BackboneWork.png
Arbeitsweise von Backbone.js

Eine Backbone-Anwendung besteht aus den Elementen Model, Collection, View und Router. Das Interaktionsmuster von Backbone kann dem MVC-Muster zugeordnet werden. Model und View werden gemäß dem MVC-Muster umgesetzt. Allerdings fehlen konkrete Controller-Instanzen bei der Umsetzung. Dies hat folgende Gründe:

  • Der Router übernimmt die Aufgaben eines „Front Controllers“. Ein solcher Controller dient als Ereignissenke und Einstiegspunkt für alle eingehenden Anfragen an eine Webseite. Der Front Controller adressiert bei Backbone unmittelbar die jeweils verantwortliche View.
  • Die View einer Backbone-SPA übernimmt neben der Darstellung ebenfalls die Aufgabe der Ereignisbehandlung. Bei einem traditionellen MVC-Muster werden alle Aktionen im Rahmen der View zum jeweils verantwortlichen Controller weitergeleitet. Auf diese View/Controller-Separation wird bei Backbone-Anwendungen verzichtet. Der klassische Grund für die View/Controller-Separation liegt darin, dass die jeweiligen Verhaltensstrategien über verschiedene Controller ausgetauscht werden können. Ein Beispiel hierfür kann ein editierbares und nicht editierbares Verhalten sein. Durch den Verzicht auf explizite Controller-Instanzen wird der Implementierungsaufwand reduziert.

Konzept

Backbone gibt vier verschiedene Strukturierungselemente zur Realisierung einer Single-Page-Webanwendung vor. Das Fachmodell wird clientseitig durch Model und Collection-Klassen abgebildet. Bei Backbone beinhalten die Model-Objekte die Fachkonzeptdaten sowie Programmlogiken, welche direkt auf eine Model-Instanz operieren. Dies kann beispielsweise eine Datenvalidierung des Modells, die Definition von abgeleiteten Attributen, Zugriffskontrollen oder eine andere fachliche Funktionalität sein. Der nachfolgende Codeausschnitt zeigt die Implementierung eines Modells. Backbone bietet hierzu die Oberklasse Backbone.Model an. Über die Methode extend kann eine Unterklassendefinition erzeugt werden.

Modelldefinition in Backbone: <syntaxhighlight lang="javascript"> var Person = Backbone.Model.extend({

   urlRoot: '/persons',
   defaults: {
       firstname: ,
       name: ,
       isReadonly: false
   },
   initialize: function() {
       console.log('Konstruktur-Code');
   },
   validate: function(attribs) {
       if (attribs.name === undefined || attribs.name === ) {
           return 'Bitte einen Namen angeben.';
       }
   },
   allowedToEdit: function() {
       return !this.get('isReadonly');
  }

}); </syntaxhighlight> Diese Oberklasse liefert verschiedene Basisoperationen zum Umgang mit einem Model. Hierzu gehören beispielsweise die Methoden get und set zum Abrufen und Setzen von Attributen. Die Oberklasse definiert ebenfalls ein ID-Attribut zur Adressierung der Objekte. Bei clientseitig neu erfassten Objekten erfolgt eine temporäre Vergabe einer Client-ID. Über die urlRoot-Angabe kann definiert werden, unter welcher URL das Modell serverseitig verwaltet wird. Wenn der verwendete Webdienst eine REST-konforme API besitzt, so kann die komplette Client-Server-Kommunikation selbstständig von Backbone durchgeführt werden. Durch einen Aufruf der save-Methode auf dem Model wird die Synchronisation gestartet.

Collections sind ein weiteres Strukturierungselement zur Abbildung des Fachkonzepts. Eine Collection verwaltet eine Menge von Model-Instanzen. Die logische Typisierung einer Collection erfolgt über das model-Attribut. Hierdurch kann Backbone erkennen, welche Art von Model-Instanz verwaltet wird. Wie bei der Model-Oberklasse werden verschiedene Basisfunktionalitäten von der Backbone.Collection-Klasse geerbt. Hierzu gehören beispielsweise die Funktionen add, remove und sort zur Verwaltung der Listenelemente. Für die Definition einer Standardsortierung innerhalb einer Collection kann die Methode comparator implementiert werden. Ebenfalls angeboten wird die filter-Methode zur Filterung von Listenelementen.

Collection-Definition in Backbone: <syntaxhighlight lang="javascript"> var PersonCollection = Backbone.Collection.extend({

   url: '/persons',
   model: Person,
   onlyEditable: function() {
       return this.filter(function(person) {
           return person.allowedToEdit();
       });
   },
   comparator: function(person) {
       return person.get('name');
   }

}); </syntaxhighlight> Ebenfalls möglich ist die Angabe einer URL zum serverseitigen Abruf der Daten. Ausgeführt wird der Abruf der Listenelemente einer Collection durch die fetch-Methode der Basisklasse. Als drittes Element in einer Backbone-Anwendung ist der Router aufzuführen. Der Router ist für die clientseitige Navigation innerhalb der SPA verantwortlich. Für eine SPA-Anwendung wird eine Router-Instanz erzeugt. Diese Instanz verwaltet sämtliche Linkaktionen innerhalb der Anwendung. Hierdurch ist ebenfalls eine Navigation über die Webbrowser-Schaltflächen möglich. Als Nebenprodukt entstehen zusätzlich bookmarkfähige Links. Der nachfolgende Codeausschnitt veranschaulicht die Implementierung eines Routers mit Backbone. Hierbei wird von der Oberklasse Backbone.Router geerbt. Zu erkennen ist, dass über das interne routes-Objekt des Routers die verschiedenen URLs festgelegt werden. Diese internen Adressen können ebenfalls GET-Parameter beinhalten, um einen parametrisieren Webseitenaufruf im Rahmen der SPA nachzubilden. Die Einträge im routes-Objekt werden von Backbone nach dem First-Match-Verfahren abgearbeitet.

Beispiel einer Router-Definition mit Backbone: <syntaxhighlight lang="javascript"> var Router = Backbone.Router.extend({

   routes: {
      "": "home",
      "edit/:id": "edit",
      "new": "edit"
   },
   // Aktionsdefinition bei der home-Navigation
   home: function() {
       userListView.render();
   },
   // Aktionsdefinition bei der new- und edit-Navigation
   edit: function(id) {
       userEditView.render({id: id});
   }

}); // Aktivierung der globalen Linkbehandlung mit Backbone + History API Backbone.history.start({pushState: true}); </syntaxhighlight>

Die View in einer Backbone-Anwendung beinhaltet keinen HTML-Code. Sie beinhaltet Präsentationslogik zur Reaktion auf Benutzereingaben und ist für DOM-Manipulationen verantwortlich. Die eigentliche Darstellung erfolgt durch die HTML-View. Die HTML-View wird allerdings häufig bei einer SPA von der View aus mit Inhalten aus dem clientseitigen Model befüllt. Hierbei kommt die Template-Technik von Underscore zum Einsatz. Die Ausdrücke der Templatesprache erlauben eine einfache clientseitige Generierung von HTML-Inhalten auf Basis von Modellinformationen. Diese Templates können Bestandteile der Bootstrapper-Seite der SPA sein oder mittels der Text-Erweiterung von RequireJS asynchron nachgeladen werden. Backbone gibt im Rahmen der View drei Konventionen vor. Die erste Konvention bezieht sich auf das Haupt-DOM-Element, welches im Rahmen der aktuellen View verwaltet wird. Der CSS-Selektor für dieses DOM-Element soll in der Variable el abgelegt werden. Falls jQuery verwendet wird, so legt die Backbone-Infrastruktur automatisch einen Cache für das DOM-Objekt mit dem Namen $el an. Dies reduziert ständige DOM-Selektionen über jQuery und erhöht so die Performance. Für den Fall, dass das Haupt-DOM-Element für den aktuellen View-Bereich noch nicht existiert, kann die Variable tagName verwendet werden. In diesem Fall erzeugt die Backbone-Infrastruktur selbstständig ein neues DOM-Element. Diese Variante wird häufig verwendet, wenn die aktuelle Ansicht von verschiedenen partiellen View-Instanzen verwaltet wird. Dieses Vorgehen wird beispielsweise bei Auflistungen gewählt. In diesem Fall repräsentiert eine View die Liste. Zusätzlich werden für jeden Eintrag in der Liste partielle Views erzeugt. Auf diese Weise können die Funktionalitäten, die ein Listeneintrag anbietet, von den Funktionalitäten der kompletten Liste abgekapselt werden. Ein Listeneintrag kann z. B. ein direktes Löschen oder eine Bearbeitung des Eintrags anbieten.

Beispiel für eine View-Implementierung: <syntaxhighlight lang="javascript"> var UserListView = Backbone.View.extend({

   el: '.page',
   template: _.template($('#user-list-template').html()),
   events: {
      'click .refresh': 'loadAndDisplayData' // Click-Aktion auf $('.refresh')
   },
   loadAndDisplayData: function() {
       userCollection.fetch(); // Impliziert ein reset-Event auf der Collection
   },
   initialize: function() {
       // Registrierung für Events der “userCollection”
       this.listenTo(userCollection, 'add', this.addOneItem);
       this.listenTo(userCollection, 'reset', this.addAllItems);
   },
   addOneItem: function(user) {
       var view = new UserListItemView({model: user }); // Partielle View erzeugen
       $('#userListBody').append(view.render().el); // Eintrag der Liste hinzufügen
   },
   addAllItems: function() {
       this.$el.find('#userListBody').html(); // Liste leeren
       userCollection.each(this.addOneItem, this); // Alle Elemente neu hinzufügen
   },
   render: function() {
       this.$el.html(this.template); // Haupt-Template der Seite hinzufügen
       if (!userCollection.length) {
           this.loadAndDisplayData(); // Einträge laden und anzeigen
       } else {
           this.addAllItems();
       };
       return this;
   }

}); </syntaxhighlight>

Die zweite Konvention besagt, dass ein verwendetes HTML-Template in der Variable template abgelegt werden soll. Auf diese Weise kann verhindert werden, dass ein Template zum wiederholten Mal geladen wird. Die dritte Konvention sieht das Vorhandensein einer Methode mit dem Namen render vor. Diese Methode soll Basis-DOM-Manipulationen durchführen. Im oben aufgeführten Beispiel wird in der render-Methode die initiale Darstellung einer Listenansicht durch ein Template geladen. Ebenfalls wird das Laden der Listeneinträge veranlasst, falls diese nicht schon auf dem Client vorhanden sind. Die Registrierung von DOM-Events im Rahmen von Backbone-Views erfolgt über das events-Dictionary. Hierbei werden ein DOM-Selektor für das Event und eine Callback-Methode angegeben. Sobald das selektierte Event eintritt, erfolgt automatisch ein Aufruf der Callback-Methode. Die Eventbehandlung bezieht sich immer auf den DOM-Teilbaum des el-Elements.

Vorkommen

Folgende Webanwendungen wurden mit Backbone.js erstellt:<ref>builtwithbackbonejs.com: <templatestyles src="Webarchiv/styles.css" />{{#if:20150513033832

      | {{#ifeq: 20150513033832 | *
    | Vorlage:Webarchiv/Wartung/Stern{{#if: Showcase of apps and websites using Backbone.js | {{#invoke:WLink|getEscapedTitle|Showcase of apps and websites using Backbone.js}} | {{#invoke:Webarchiv|getdomain|http://builtwithbackbonejs.com/}} }} (Archivversionen)
    | {{#iferror: {{#time: j. F Y|20150513033832}}
         | {{#if:  || }}Vorlage:Webarchiv/Wartung/DatumDer Wert des Parameters {{#if: wayback | wayback | Datum }} muss ein gültiger Zeitstempel der Form YYYYMMDDHHMMSS sein!
         | {{#if: Showcase of apps and websites using Backbone.js | {{#invoke:WLink|getEscapedTitle|Showcase of apps and websites using Backbone.js}} | {{#invoke:Webarchiv|getdomain|http://builtwithbackbonejs.com/}} }} {{#ifeq:  | [] | [ | ( }}Memento{{#if: {{#if:  | {{{archiv-bot}}} |  }} |  des Vorlage:Referrer }} vom {{#time: j. F Y|20150513033832}} im Internet Archive{{#if:  | ;  }}{{#ifeq:  | [] | ] | ) }}
      }}
  }}
      | {{#if:
          | {{#iferror: {{#time: j. F Y|{{{webciteID}}}}}
    | {{#switch: {{#invoke:Str|len|{{{webciteID}}}}}
       | 16= {{#if: Showcase of apps and websites using Backbone.js | {{#invoke:WLink|getEscapedTitle|Showcase of apps and websites using Backbone.js}} | {{#invoke:Webarchiv|getdomain|http://builtwithbackbonejs.com/}} }} {{#ifeq:  | [] | [ | ( }}Memento{{#if: {{#if:  | {{{archiv-bot}}} |  }} |  des Vorlage:Referrer }} vom {{#time: j. F Y| 19700101000000 + {{#expr: floor {{#expr: {{#invoke:Str|sub|{{{webciteID}}}|1|10}}/86400}} }} days}} auf WebCite{{#if:  | ;  }}{{#ifeq:  | [] | ] | ) }}
       | 9 = {{#if: Showcase of apps and websites using Backbone.js | {{#invoke:WLink|getEscapedTitle|Showcase of apps and websites using Backbone.js}} | {{#invoke:Webarchiv|getdomain|http://builtwithbackbonejs.com/}} }} {{#ifeq:  | [] | [ | ( }}Memento{{#if: {{#if:  | {{{archiv-bot}}} |  }} |  des Vorlage:Referrer}} vom {{#time: j. F Y| 19700101000000 + {{#expr: floor {{#expr: {{#invoke:Str|sub|{{#invoke:Expr|base62|{{{webciteID}}}}}|1|10}}/86400}} }} days}} auf WebCite{{#if:  | ;  }}{{#ifeq:  | [] | ] | ) }}
       | #default= Der Wert des Parameters {{#if: webciteID | webciteID | ID }} muss entweder ein Zeitstempel der Form YYYYMMDDHHMMSS oder ein Schüsselwert mit 9 Zeichen oder eine 16-stellige Zahl sein!Vorlage:Webarchiv/Wartung/webcitation{{#if:  || }}
      }}
    | c|{{{webciteID}}}}} {{#if: Showcase of apps and websites using Backbone.js | {{#invoke:WLink|getEscapedTitle|Showcase of apps and websites using Backbone.js}} | {{#invoke:Webarchiv|getdomain|http://builtwithbackbonejs.com/}} }} (Memento{{#if: {{#if:  | {{{archiv-bot}}} |  }} |  des Vorlage:Referrer}} vom {{#time: j. F Y|{{{webciteID}}}}} auf WebCite{{#if:  | ;  }}{{#ifeq:  | [] | ] | ) }}
  }}
          | {{#if: 
              | Vorlage:Webarchiv/Today
              | {{#if:
                      | Vorlage:Webarchiv/Generisch
                      | {{#if: Showcase of apps and websites using Backbone.js | {{#invoke:WLink|getEscapedTitle|Showcase of apps and websites using Backbone.js}} | {{#invoke:Webarchiv|getdomain|http://builtwithbackbonejs.com/}} }}  
                 }}}}}}}}{{#if:
    | Vorlage:Webarchiv/archiv-bot
  }}{{#invoke:TemplatePar|check
     |all      = url=
     |opt      = text= wayback= webciteID= archive-is= archive-today= archiv-url= archiv-datum= ()= archiv-bot= format= original=
     |cat      = Wikipedia:Vorlagenfehler/Vorlage:Webarchiv
     |errNS    = 0
     |template = Vorlage:Webarchiv
     |format   = *
     |preview  = 1
  }}{{#ifexpr: {{#if:20150513033832|1|0}}{{#if:|+1}}{{#if:|+1}}{{#if:|+1}}{{#if:|+1}} <> 1
    | {{#if:  || }}Vorlage:Webarchiv/Wartung/Parameter{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Genau einer der Parameter 'wayback', 'webciteID', 'archive-today', 'archive-is' oder 'archiv-url' muss angegeben werden.|1}}
  }}{{#if: 
    | {{#switch: {{#invoke:Webarchiv|getdomain|{{{archiv-url}}}}}
        | web.archive.org = 
          {{#if:  || }}{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Im Parameter 'archiv-url' wurde URL von Internet Archive erkannt, bitte Parameter 'wayback' benutzen.|1}} 
        | webcitation.org = 
          {{#if:  || }}{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Im Parameter 'archiv-url' wurde URL von WebCite erkannt, bitte Parameter 'webciteID' benutzen.|1}} 
        | archive.today |archive.is |archive.ph |archive.fo |archive.li |archive.md |archive.vn = 
          {{#if:  || }}{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Im Parameter 'archiv-url' wurde URL von archive.today erkannt, bitte Parameter 'archive-today' benutzen.|1}}
      }}{{#if: 
         | {{#iferror: {{#iferror:{{#invoke:Vorlage:FormatDate|Execute}}|}}
             | {{#if:  || }}Vorlage:Webarchiv/Wartung/Parameter{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Der Wert des Parameter 'archiv-datum' ist ungültig oder hat ein ungültiges Format.|1}}
          |  }} 
         | {{#if:  || }}Vorlage:Webarchiv/Wartung/Parameter{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Der Pflichtparameter 'archiv-datum' wurde nicht angegeben.|1}}
      }}
    | {{#if: 
         | {{#if:  || }}Vorlage:Webarchiv/Wartung/Parameter{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Der Parameter 'archiv-datum' ist nur in Verbindung mit 'archiv-url' angebbar.|1}}
      }}
  }}{{#if:{{#invoke:URLutil|isHostPathResource|http://builtwithbackbonejs.com/}}
    || {{#if:  || }}
  }}{{#if: Showcase of apps and websites using Backbone.js
    | {{#if: {{#invoke:WLink|isBracketedLink|Showcase of apps and websites using Backbone.js}}
        | {{#if:  || }}
      }}
    | {{#if:  || }}Vorlage:Webarchiv/Wartung/Linktext_fehlt
  }}{{#switch: 
    |addlarchives|addlpages= {{#if:  || }}{{#if: 1 |Vorlage:Webarchiv/Wartung/Parameter}}{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: enWP-Wert im Parameter 'format'.|1}}
  }}{{#ifeq: {{#invoke:Str|find|http://builtwithbackbonejs.com/%7Carchiv}} |-1
    || {{#ifeq: {{#invoke:Str|find|{{#invoke:Str|cropleft|http://builtwithbackbonejs.com/%7C4}}%7Chttp}} |-1
         || {{#switch: {{#invoke:Webarchiv|getdomain|http://builtwithbackbonejs.com/ }}
              | abendblatt.de | daserste.ndr.de | inarchive.com | webcitation.org = 
              | #default = {{#if:  || }}{{#if: 1 |Vorlage:Webarchiv/Wartung/URL}}{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Archiv-URL im Parameter 'url' anstatt URL der Originalquelle. Entferne den vor der Original-URL stehenden Mementobestandteil und setze den Archivierungszeitstempel in den Parameter 'wayback', 'webciteID', 'archive.today' oder 'archive-is' ein, sofern nicht bereits befüllt.|1}}
            }} 
       }}
  }}</ref>

Siehe auch

JavaScript MVC Frameworks

Literatur

  • {{#invoke:Vorlage:Literatur|f}}

Weblinks

Einzelnachweise

<references />