前端通过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数据,可以随便模拟。
结果如下:
版权声明:博主文章,可以不经博主允许随意转载,随意修改,知识是用来传播的。