2016-10-31 4 views
2

Typ in Vue Überprüfung erfordert die Konstruktorfunktion als Typ übergeben werden:Wie kann ich direkt auf den Koordinatenkonstruktor in JavaScript zugreifen?

props: { 
    coords: { 
    type: Coordinates, 
    required: true, 
    }, 
}, 

ich nicht herausfinden kann, wie man den Coordinates Konstruktor zu finden. Kann Object nicht verwenden, weil es von nichts erbt, und würde lieber nichts einfach zulassen.

Es gibt nichts auf MDN darüber, wie es für den Zugriff direkt: https://developer.mozilla.org/en-US/docs/Web/API/Coordinates

Irgendwelche Ideen?

EDIT: Um zu klären, window.Coordinates ist undefiniert. Das obige Codebeispiel funktioniert nicht.

+1

MDN sagt, es ist eine Schnittstelle, also versuchen Sie vielleicht, den Prototyp der Implementierung zu finden? –

+0

@ 潘俊杰: Das habe ich gefragt. Ich kann es nicht finden. – callumacrae

Antwort

2

Coordinates ist nicht etwas ausgesetzt im Browser von Web-Entwicklern verwendet werden. Es ist eine Schnittstelle von W3C Geo-Spezifikationen definiert, für Browser-Anbieter, die die Geolocation-Funktionen implementieren. Eine Schnittstelle beschreibt, wie eine bestimmte Art von Datenstruktur aussieht. Zum Beispiel coords im folgende Beispiel:

navigator.geolocation.getCurrentPosition(function (pos) { 
    var coords = pos.coords 
    console.log(coords) 
}) 

Auch wenn Sie die wörtlichen von Coordinates mit folgendem Code abrufen. Es ist nur ein Objekt (ja, es ist ein Prototyp, kein Konstruktor), man kann kaum etwas tun.

Object.getPrototypeOf(pos.coords) 

So zwei Punkte hier:

  1. Coordinates ist nicht für Web-Entwickler.
  2. Coordinates ist nicht einmal eine Funktion.

Die einzige Möglichkeit, die ich denke, ist define your own validator und prüfen, ob der Eingabewert Ihre Anforderung erfüllt. Dies wäre einfacher, weil Coordinates ein spezielles toString() Symbol hat:

props: { 
    coords: { 
    validator: function (value) { 
     return value.toString() === '[object Coordinates]' 
    } 
    } 
} 

Jedoch kann diese Prüfung fehl, wenn Sie Ihre eigenen coords Daten von Hand Handwerk. Eine allgemeinere Art ist wie Duck-Typing, einfach überprüfen, ob es die richtigen Eigenschaften hat, latitude und longitude normalerweise.

+0

Ah, danke! Das ist definitiv die beste Antwort :) – callumacrae

0

Sie müssen prüfen, ob der Wert ein intance Ihres contructor ist, eine benutzerdefinierte Prüfung verwendet werden:

coords { 
    validator: function (value) { 
     return value instanceOf Coordinates; // Coordinates is a constructor in your case 
    } 
} 

Werfen Sie einen Blick von HTML5 Geolocation Dokumentation.

+0

Ich weiß, wie man 'instanceof' benutzt. 'window.Coordinates' ist undefiniert. – callumacrae

+0

Sie können Ihren eigenen Validator für Koordinaten erstellen oder Ihre eigene Klasse/Prototyp erstellen – Med

0

Ich habe auch mit diesem Problem zu tun. Meine Lösung ist definieren einen gefälschten Konstruktor:

function Coordinates() {} 
Coordinates.prototype = Object.prototype 

in vue Komponente

props: { 
    coords: { 
    type: Coordinates 
    } 
} 

Dies funktioniert, weil Vue instanceof verwenden, um benutzerdefinierte Typen zu validieren.

+0

Das vereitelt den Punkt bei der Verwendung der Validierung: Sie könnten auch 'type: Object' verwenden. – callumacrae

+0

@callumacrae: Vue validiert 'type: Object' unter Verwendung von' Object.prototype.toString.call (propValue) === '[object Object]' ', so dass Sie' type: Object' NICHT verwenden können, um irgendein Objekt mit Konstruktor zu validieren –

Verwandte Themen