Como os tipos e membros WinRT são representados no JavaScript
Eis como utilizar tipos e membros WinRT a partir do código JavaScript do lado da Web numa aplicação WebView2 ao chamar código WinRT do lado nativo a partir de código do lado da Web.
Equivalentes de idioma
A ferramenta de Projeção WinRT JS (wv2winrt) webView2 converte de winRT para construções de linguagem JavaScript da seguinte forma.
Construção de linguagem WinRT | Representação de JavaScript | Observações |
---|---|---|
UInt8 , Int16 , UInt16 , Int32 , UInt32 , Int64 , UInt64 , Single , Double |
Number |
|
Char , String |
String |
Uma instância de JavaScript String é convertida numa instância WinRT String . |
Boolean |
Boolean |
|
Windows.Foundation.DateTime estrutura |
Date |
|
Windows.Foundation.TimeSpan estrutura |
Number |
|
Guid |
String |
Uma instância de JavaScript String que contém uma representação de cadeia de carateres de um UUID (com ou sem delimitamento { e } chavetas) é convertida para o UUID correspondente. Um UUID é convertido na respetiva representação de cadeia, com carateres delimitadores { e } chavetas no início e no fim. Para obter informações sobre o UUID, consulte RFC 4122. |
IVector<T> , IVectorView<T> , IObservableVector<T> |
Array objeto e JavaScript |
Se uma RuntimeClass instância implementar interfaces vector , será representada em JavaScript como o objeto habitual descrito abaixo, mas também funcionará como uma matriz JavaScript. As leituras e as escritas são executadas em direto no objeto de vetor WinRT subjacente. |
IMap<K,V> , IMapView<K,V> , IObservableMap<K,V> |
Objeto JavaScript | Se uma RuntimeClass instância implementar interfaces map , é representada em JavaScript como o objeto habitual descrito abaixo, mas também tem propriedades com o nome e valores do objeto de mapa WinRT subjacente. As leituras e as escritas são executadas em direto no objeto de mapa WinRT subjacente. |
Enum |
Objeto JavaScript | Um tipo de enumeração é representado como um objeto JavaScript. Cada valor de enumeração é uma Number propriedade no objeto JavaScript. |
Struct |
Objeto JavaScript | Um Struct tipo é convertido num objeto JavaScript que tem nomes de propriedade que correspondem aos nomes dos membros do Struct tipo. Esta é uma conversão bidirecional. |
Namespace |
Objeto JavaScript | Um espaço de nomes é representado como um objeto JavaScript que tem uma propriedade para espaços de nomes subordinados, tipos de enumeração ou RuntimeClass . O espaço de nomes pode ter 0, 1 ou muitos espaços de nomes subordinados, enumerações ou runtimeclasses e cada espaço de nomes subordinado individual, enumeração e runtimeclass obtém a sua própria propriedade. |
Class |
Objeto JavaScript | Uma RuntimeClass classe é convertida num objeto JavaScript que tem os mesmos métodos, propriedades e eventos. |
Interface |
Objeto JavaScript | Uma RuntimeClass interface é convertida num objeto JavaScript que tem os mesmos métodos, propriedades e eventos. Não existe suporte para implementar uma interface no JavaScript. |
Membro estático da classe | Propriedade do objeto JavaScript | Confira a seguir. |
Construtor de classes | Construtor e função JavaScript | Confira a seguir. |
Ao transmitir objetos JavaScript para objetos anfitriões:
- Se os objetos JavaScript
Date
precisarem de ser transmitidos para objetos anfitriões comoVT_DATE
, defina a propriedade do objeto anfitriãoshouldSerializeDates
comotrue
. Por predefinição,Date
os objetos são transmitidos para o anfitrião comostring
, utilizandoJSON.stringify
. - Se as matrizes escritas em JavaScript precisarem de ser transmitidas para objetos anfitriões como
array
, defina a propriedade do objeto anfitriãoshouldPassTypedArraysAsArrays
comotrue
. Por predefinição, as matrizes digitadas são transmitidas para o anfitrião comoIDispatch
.
Veja também:
Membros estáticos da classe
Uma classe de runtime com propriedades estáticas, métodos estáticos ou eventos estáticos é representada como uma propriedade do espaço de nomes. Cada propriedade estática, método estático e evento estático é representado como uma propriedade nesse objeto JavaScript da runtimeclass.
Por exemplo, para o método Windows.Foundation.Uri.EscapeComponent
estático da API WinRT:
-
Windows.Foundation
é o espaço de nomes. -
Uri
é a runtimeclass. -
EscapeComponent
é o método estático.
Em JavaScript, a representação tem um aspeto semelhante: : chrome.webview.hostObjects.Windows.Foundation.Uri.EscapeComponent
-
EscapeComponent
é um método JavaScript que é uma propriedade no objeto JavaScript daUri
runtimeclass. - Runtimeclass
Uri
é uma propriedade no objeto JavaScript doFoundation
espaço de nomes.
Por exemplo, para chamar o método Windows.Foundation.Uri.EscapeComponent
estático , chame:
`chrome.webview.hostObjects.Windows.Foundation.Uri.EscapeComponent("example");`
O objeto de espaço de nomes JavaScript aqui é chrome.webview.hostObjects.Windows.Foundation
.
Construtores de classes
Um construtor de uma RuntimeClass
classe é representado como uma única propriedade num objeto JavaScript que pode ser chamado de duas formas:
- Como construtor no objeto de espaço de nomes JavaScript.
- Como uma função no objeto de espaço de nomes JavaScript.
Por exemplo, para criar um novo Windows.Foundation.Uri
objeto, pode chamá-lo de construtor com new
:
`let uri = new chrome.webview.hostObjects.Windows.Foundation.Uri("https://example.com/");`
Em alternativa, chame-a como uma função, sem new
:
`let uri = chrome.webview.hostObjects.Windows.Foundation.Uri("https://example.com/");`
O objeto de espaço de nomes JavaScript aqui é chrome.webview.hostObjects.Windows.Foundation
.
Sobrecargas do método
Se um nome do método WinRT estiver sobrecarregado para mais do que um método, chamar esse nome de método de JavaScript chamará a sobrecarga que tem o número correspondente de parâmetros.
Se existir mais do que uma sobrecarga que tenha um número correspondente de parâmetros, a primeira sobrecarga encontrada nos metadados será chamada.
Parâmetros de saída do método
Se um método WinRT tiver out
parâmetros, ao chamar esse método de JavaScript, o resultado devolvido será um objeto JavaScript que uma propriedade para cada out
parâmetro. Se o método tiver umvoid
tipo de não retorno, o objeto de resultado devolvido também terá uma propriedade com o nome value
que contém o valor devolvido do método.
Ao chamar um método WinRT com out
parâmetros, todos os out
parâmetros são ignorados na lista de parâmetros na chamada de método (a menos que sejam do tipo de matriz). Por exemplo, suponha que um método WinRT com out
parâmetros e um tipo de nãovoid
retorno é definido da seguinte forma, com MIDL3:
String MethodWithOutParams(String stringParam1,
out Int32 intParam2,
out Int32 intParam3,
String stringParam4);
Quando chamar esse método de JavaScript, omita os out
argumentos:
let result = object.MethodWithOutParams("stringParam1",
"stringParam4");
Em seguida, para ler o valor devolvido do método WinRT, leia a value
propriedade no objeto JavaScript result
. Para ler os parâmetros do out
método WinRT, leia as propriedades correspondentemente nomeadas no objeto JavaScript result
:
console.assert(result.value == "return value");
console.assert(result.intParam2 == 1);
console.assert(result.intParam3 == 2);
Para parâmetros de tipo out
de matriz, a matriz tem de ser transmitida para a lista de parâmetros do método ao chamar o método. Para um tipo que nãovoid
seja devolvido, a matriz de resultados substituirá a matriz transmitida para a chamada de método. Para o void
tipo de retorno, a matriz de resultados será o resultado da chamada do método.
// Both methods update input array values to index values
String NonVoidMethodWithArrayOutParam(out Int[] intArrayParam);
Void VoidMethodWithArrayOutParam(out Int[] intArrayParam);
let input_array1 = [0, 0, 0];
let result1 = object.NonVoidMethodWithArrayOutParam(input_array1);
console.assert(input_array1 == [0, 1, 2])
let input_array2 = [0, 0, 0];
let result2 = object.VoidMethodWithArrayOutParam(input_array2);
console.assert(result2 == [0, 1, 2]);
Se transmitir matrizes digitadas como parâmetros de matriz out
, chrome.webview.hostObjects.options.shouldPassTypedArraysAsArrays
tem de ser definido como true
.
Veja também:
- Problema n.º 2788 sobre o SDK WebView2 e o SDK da Aplicação windows (WinUI3) em C++ WinRT