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, v) in data) {
                html += "<li>" + v.name + "---" + v.age + "</li>";
            }
            $(#list).html = html;
        }
    });

    self.on("click", ".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數據,可以隨便模擬。

結果如下:

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM