2016-07-22 9 views
1

Ich habe einige Vue.js Code, der ES6 Pfeilfunktionen verwendet. Allerdings scheint Safari (und es scheint Chrome auf OSX in einem Fall) dies nicht zu mögen. Hier ist der Code:Wie überschreibe ich diesen ES6-Code, um Safari-kompatibel zu sein?

fetchItemCount: function(){ 
       this.$http.get('/api/fetchItemCount') 
        .then(response => { 
         this.itemCount = response.data; 
        }) 
        .catch(response => { 

        }); 
      }, 

Ich habe mehrere Funktionen, die die Pfeilsyntax verwenden. Wie kann ich sie umschreiben, um sie zu vermeiden, aber immer noch die gleiche Arbeit zu machen?

Ich habe mit Babel versucht, den Code transpile aber das scheint Fehler (Kann nicht gesetzt Eigenschaft ‚Vue‘ undefinierter oder NULL-Verweis) einzuführen

+0

Sie können https://babeljs.io/ verwenden, um Ihren Code in ES5 zu übertragen –

+0

Die nächste Version von Safari (10) wird auch Pfeilfunktionen und alle anderen Teile von ES6 für diese Angelegenheit unterstützen. Ältere Browser benötigen jedoch immer noch ES5-Code, der mit einem Transpiler wie Babel (im obigen Kommentar erwähnt) transpiliert werden kann. – nils

+0

Bitte sehen Sie meine Bearbeitung - Ich habe versucht, mit Babel, aber es führt zu Fehlern. – flurpleplurple

Antwort

3

Wie andere haben festgestellt, eine Transpiler wie babel verwenden würde das tun Trick aber da das hier nicht immer möglich ist ist wie es ohne Pfeilfunktionen aussehen würde.

fetchItemCount: function(){ 
    var that = this; 
    this.$http.get('/api/fetchItemCount') 
     .then(function(response) { 
      that.itemCount = response.data; 
     }) 
     .catch(function(response) { 

     }); 
}, 

Was die Pfeil-Funktion gibt Ihnen im Wesentlichen eine Funktion ist, die den this Umfang hält, wo er erklärt hat, zu reproduzieren, so dass wir müssen nur this im äußeren Umfang einer neuen Variablen zuweisen und verwenden, die innerhalb der Funktion.

Wie LinusBorg bemerkte in den Kommentaren, wenn vue-resource verwenden Sie müssen den var that = this; Teil nicht tun, da die Bibliothek this in dem Rückruf an den äußeren Rahmen für Sie ändern. Dies ist spezifisch für vue-resource Ressource und nicht, wie es im Allgemeinen mit Versprechungen gemacht wird, so dass es im Allgemeinen nicht mit anderen Bibliotheken arbeiten wird.

+0

Dies war genau das, was ich gesucht habe, danke! – flurpleplurple

+1

Während Ihre Erklärung im Allgemeinen korrekt ist, ist die 'that = this'-Schließung bei der Verwendung von vue-resource nicht notwendig, da sie die Callback-Funktion für Sie an den vm-Bereich bindet. –

+0

Gut zu wissen, obwohl ich meine Antwort so behalten werde, wie es ist, da es nicht das normale Verhalten von Versprechen ist, an den äußeren Kontext zu binden. Ich werde es mir aber notieren! –

2

Eigentlich müssen Sie Ihren Code neu schreiben, zumindest nicht manuell. Was Sie tun können, ist, schreiben Sie Code wie das Beispiel, das Sie gaben und verwenden Sie einen Transpiler, wie Babel, um Ihren ES6-Code zu ES5 umzuschreiben.

Sie können es fast transparent für sich selbst machen, indem Sie einen Task-Manager wie Gulp oder Grunt verwenden.

Wenn Sie wissen müssen, wie Sie einen Task-Manager verwenden, werfen Sie einen Blick auf this article. Sie erhalten einen kurzen und fokussierten Überblick darüber, wie Sie Gulp verwenden können.

Nachdem Sie es gelesen haben, werden Sie sehen, wie einfach es ist, Dateien automatisch zu beobachten und ihren Inhalt durch ein Gulp-Skript zu straffen. Verwenden Sie einfach Gulp Babel plugin, um diese Aufgabe automatisch für Sie auszuführen.

Zum Beispiel:

const gulp = require('gulp'); 
const babel = require('gulp-babel'); 

gulp.task('transpile',() => { 
    return gulp.src('src/MY-VUE-SOURCE.js') 
     .pipe(babel({ 
      presets: ['es2015'] 
     })) 
     .pipe(gulp.dest('SOME_DESTINATION')); 
}); 

gulp.task('watch', function() { 
    gulp.watch(['src/**/*'], ['transpile']); 
}); 

Nach dem Ausführen schluck Uhr, die ausgeführt wird gehalten, bis Sie es manuell stoppen, jede Änderung, die Sie MY-VUE-SOURCE.js machen wird automatisch für Sie transpiled werden.

+0

Ich benutze Gulp und versuchte, Bower zu verwenden. Als ich jedoch den Babelified-Code anwendete, bekam ich einen Fehler, der gleich zu Beginn des Vue.js-Bibliothekscodes auftrat: 'Die Eigenschaft 'Vue' von undefinierter oder Null-Referenz konnte nicht gesetzt werden. Dies verwendete das Babel-Preset ES2015. – flurpleplurple

+0

Werde einen Blick darauf werfen. –

Verwandte Themen