快速入门

本示例可参考示例文件"CaseStudy\WebViewer\调用Foxtable对象.Table"的窗口"快速入门"。

我们先看这个快速入门示例,然后再进行细节的介绍。

这个示例很简单,就是在网页中单击"增加行"按钮,直接在Foxtable的订单表中增加一行:

所有的代码都在AfterLoad事件中:

'''Async
Dim wv As WebViewer = e.Form.Controls("WebViewer1").WebViewer
Await
wv.EnsureCoreWebView2Async(Nothing) '初始化浏览器
Dim ft As New FoxLib(wv) '创建Foxtable
wv.CoreWebView2.AddHostObjectToScript("ft", ft)  '将Foxtable注入到WebViewer脚本环境
'
定义测试页面,本地网页和远程网页都可以,这里为了方便,直接将网页嵌入到代码中了
Dim
html As String = <![CDATA[
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>
快速入门</title>
    <style>button{padding:10px 30px;font-size:16px;margin:20px;}</style>
</head>
<body>
    <button onclick="addOrderRow()">
增加行</button>
    <script>
        const ft = window.chrome.webview.hostObjects.ft
//
引用Foxtable
        async function addOrderRow() {
            const Orders = await ft.Tables["
订单"];
            let dr = await Orders.AddNew();
            dr["
产品"] = "PD01";
            dr["
客户"] = "CS03";
            dr["
雇员"] = "EP02";
            dr["
单价"] = 20;
            dr["
折扣"] = 0.05;
            dr["
数量"] = 180;
            dr["
日期"] = new Date();
            alert(await dr["
客户"] + "增加了新订单"); //显示新增订单的客户名称
        }
    </script>
</body>
</html>
]]>
.Value
wv.NavigateToString(html)
'打开测试页面

可以看到在js中增加行的代码,和在Foxtable增加行的代码,基本一样

使用步骤

1、注入Foxtable库

如果要在前端js代码使用Foxtable的功能,必须将Foxtable库注入到WebViewer的脚本环境,代码为:

Dim ft As New FoxLib(wv) '创建Foxtable库,参数为即将注入此库的WebViewer控件
wv.CoreWebView2.AddHostObjectToScript("ft", ft)  '将Foxtable注入到WebViewer脚本环境

必须在浏览器已经初始化后才能注入Foxtable库,否则无效。

浏览器只需初始化一次,Foxtable库也只需注入一次,一般都在窗口的AfterLoad事件执行。

2、引用Foxtable库

Foxtable库注入成功后,就可以在js代码中引用Foxtable库了,引用代码为:

const ft = window.chrome.webview.hostObjects.ft

3、使用foxtable库

引用Foxtable库后,就可以在js脚本中使用Foxtable的全部功能了,例如给订单表增加一行。

const Orders = await ft.Tables["订单"]; //引用订单表
let dr = await Orders.AddNew();
dr["
产品"] = "PD01";
dr["
客户"] = "CS03";
dr["
雇员"] = "EP02";
dr["
单价"] = 20;
dr["
折扣"] = 0.05;
dr["
数量"] = 180;
dr["
日期
"] = new Date();

除了语法差异,上面的js代码和Foxtable原生代码基本是一样的。

4、移除Foxtable库(非必须)

在窗口的AfterClose加上代码:

Dim
wv As WebViewer = e.Form.Controls("WebViewer1").WebViewer
wv.CoreWebView2.RemoveHostObjectFromScript(
"ft") '移除Foxtable

await与返回值

前面的代码,有两处用到了await,分别是增加行:

let dr = await Orders.AddNew();

和显示客户名称:

alert(await dr["客户"] + "增加了新订单"); //显示新增订单的客户名称


二者
的共同之处是都有返回值,AddNew返回新增行,dr["客户"]返回客户名称 。

如果是普通赋值语句,则不能加await,例如你将上面的


dr["
产品"] = "PD01";

改为:

await dr["
产品"] = "PD01";

代码将不能正常运行,按F12
进入开发者模式,可以看到错误提示:Invalid left-hand side in assignment

调用foxtable成员时,请记住以下原则:

1、如果是取值,一定要加上await,否则你得到的永远是null

2、如果是赋值,则不能加上await,否则所有js脚本都会失效

await的位置

根据上述原则,await一定要加载取值的位置,而不是赋值的位置。

假定希望在网页中单击某个按钮能切换订单表的锁定状态,如果这样写:

Orders.AllowEdit = !Orders.AllowEdit;

由于没有加await,肯定是不行的,如是加上await:

await Orders.AllowEdit = !Orders.AllowEdit;

也还是不行,因为await应该加在取值的位置,而不是赋值的位置,所以正确的写法是:

Orders.AllowEdit = !await Orders.AllowEdit;

再看前面的示例代码中显示客户名称的代码:

alert(await dr["客户"] + "增加了新订单")

await没有加在行首,而是加在dr["客户"]前面,也是一样的道理。


本页地址:http://www.foxtable.com/webhelp/topics/6233.htm