前端通過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數據,可以隨便模擬。
結果如下: