go语言使用go-sciter创建桌面应用(九) 通过view.window创建新窗口后,如何加载后端数据

前端通过view.window创建新窗口后,如何在新窗口中加载后端数据,主要有两种方法:

1、通过在go里面使用DefineFunction定义方法,供前端使用,来获取数据。

2、前端使用view.request请求接口,来获取后端数据。

 

main.go的代码如下:

package main

import (
	json2 "encoding/json"
	"github.com/sciter-sdk/go-sciter"
	"github.com/sciter-sdk/go-sciter/window"
	"github.com/tidwall/gjson"
	"log"
	"path/filepath"
)

type Person struct {
	Name string `json:"name"`
	Age  uint8  `json:"age"`
}

//定义函数
func setWinHandler(w *window.Window) {
	//定义函数,在tis脚本中需要通过view对象调用

	w.DefineFunction("getData",func(args ...*sciter.Value) *sciter.Value {
		json := args[0].String()

		//获取前端传来的下标
		index := gjson.Get(json,"index")

		//数据,这里模拟从数据库中得到的数据
		persons := []Person{
			{
				Name: "aaa",Age:  11,},{
				Name: "bbb",Age:  22,{
				Name: "ccc",Age:  33,}

		var data []Person

		if index.Int() == -1 {
			data = persons
		} else {
			data = []Person{persons[index.Int()]}
		}

		b,_ := json2.Marshal(data)
		return sciter.NewValue(string(b))
	})
}

func main() {
	//创建window窗口
	w,err := window.New(sciter.SW_TITLEBAR|
		sciter.SW_RESIZEABLE|
		sciter.SW_CONTROLS|
		sciter.SW_MAIN|
		sciter.SW_ENABLE_DEBUG,nil)
	if err != nil {
		log.Fatal(err)
	}
	//注意这个地方,sciter较新的版默认的情况下禁用了非安全脚本功能
	w.SetOption(sciter.SCITER_SET_SCRIPT_RUNTIME_FEATURES,sciter.ALLOW_FILE_IO|
		sciter.ALLOW_SOCKET_IO|
		sciter.ALLOW_SYSINFO)
	//加载文件
	path,_ := filepath.Abs("./demo1.html")
	w.LoadFile(path)
	//设置标题
	w.SetTitle("你好,世界")
	//设置窗口处理程序
	setWinHandler(w)
	//显示窗口
	w.Show()
	//运行窗口,进入消息循环
	w.Run()
}

demo1.html代码如下:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <style>
        .br {
            width: 100%;
            border: 1px solid #ccc;
            margin: 10px auto;
        }
    </style>
</head>
<body>
<div class="br">
    <button id="win1">窗口</button>
</div>
<script type="text/tiscript">
    //新窗口
    $(#win1).on("click",function() {
        var win1 = view.window({
            type: View.TOOL_WINDOW,url: self.url("simple.html"),x: 200,y: 200,width: 400,height: 400,client: false,state: View.WINDOW_SHOWN,//窗口标题
            caption: "新窗口",alignment: 3,});
    });
</script>
</body>
</html>

simple.html的代码如下:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <style>
        .br {
            display: inline-block;
            padding: 2px;
            border: 1px solid #ccc;
            background: #fff;
            text-align: center;
        }
    </style>
</head>
<body>
<div>
    <ul id="list">
        <li></li>
    </ul>

    <a href="#" class="page br" data-index="0">1</a>
    <a href="#" class="page br" data-index="1">2</a>
    <a href="#" class="page br" data-index="2">3</a>

    <a href="#" class="ajax br">ajax</a>
</div>
</body>
<script type="text/tiscript">
    view.root.on("ready",function() {
        //注意这里getData方法,我们是在主窗口注册的
        //通过view.window创建的子窗口,我们需要通过view.parent访问父级来调用getData
        var params = {};
        params.index = -1;
        var data = view.parent.getData(JSON.stringify(params));
        //解析从后台传来的数据
        data = JSON.parse(data);

        if (data) {
            var html = "";
            for(var (k,v) in data) {
                html += "<li>" + v.name + "---" + v.age + "</li>";
            }
            $(#list).html = html;
        }
    });

    self.on("click",".page",function() {
        var index = this.attributes["data-index"];
        var params = {};
        params.index = index;
        var data = view.parent.getData(JSON.stringify(params));
        data = JSON.parse(data);
        if (data) {
            var html = "";
            for(var (k,".ajax",function() {
        view.request({
            type: #get,url: "http://127.0.0.1",protocol: #basic,params: {
                "test": "test"
            },//设置返回数据类型为json
            output: #json,//成功回调函数
            success: function(data,status) {
                if (data) {
                    var html = "";
                    for(var (k,v) in data) {
                        html += "<li>" + v.name + "---" + v.age + "</li>";
                    }
                    $(#list).html = html;
                }
            },//失败回调函数
            error: function(err,status) {
                view.msgbox(#alert,err);
            }
        });
    });

</script>
</html>

说明,http://127.0.0.1 返回的数据是我用PHP输出的一些json数据,可以随便模拟。

结果如下:

  

相关文章

Golang的文档和社区资源:为什么它可以帮助开发人员快速上手...
Golang:AI 开发者的实用工具
Golang的标准库:为什么它可以大幅度提高开发效率?
Golang的部署和运维:如何将应用程序部署到生产环境中?
高性能AI开发:Golang的优势所在
本篇文章和大家了解一下go语言开发优雅得关闭协程的方法。有...