QML开发避坑指南(三):webchannel中js的加载顺序

(1)开篇

 在开发中遇到QML与QWebEngineView中的网页互动的场景(将QML交互的参数传入到网页上);在WebChannel的js端遇到调用时机导致的问题,折腾了不短时间,特此笔记,备忘。

(2)情景还原

其情景为数据初始化:在html加载完成后,即刻调用业务对象的方法请求数据,最后在信号回调函数中接收数据。js代码如下:

<script type="text/javascript">

    var webChannel = new QWebChannel(qt.webChannelTransport, function(channel) {
        //(1)C++业务对象绑定
        window.cppBizObj1 = channel.objects.cppBizObj1;
        //绑定业务对象信号回调函数
        window.cppBizObj1.reqImageCompleted.connect(onReqImageCompleted);

        var imageNo = $("#07\\.png").attr("id");
        //调用业务对象所“暴露”的方法
        window.cppBizObj1.reqImage(imageNo);
    });

    $(function() {
        //(2)页面DOM加载完成
        var imageNo = $("#07\\.png").attr("id");
        //调用业务对象所“暴露”的方法
        window.cppBizObj1.reqImage(imageNo);
    }); //onReady End
    。。。
</script>

其中有2个时机:

  1. WebChannel初始化(绑定业务对象到js对象)
  2. 页面加载完成(onready)

问题:在哪个时机调用业务对象的方法?
思维定势以为是在时机2,但经过调试却应该是在时机1。

以下是调试输出:

[。。] "onReady ...07.png", source: qrc:/index.html (68)
[。。] "Build connection withs webchanenl...", source: qrc:/index.html (47)

即:在绑定业务对象到js对象之后即可调用业务对象的方法实现数据初始化。

(3)小结

QWebChannel初始化的第2个参数也是一个回调函数,并不是即时执行。
也就说 业务对象绑定js对象 也不是及时执行,所以在 onready 时业务对象可能还没有绑定,从而造成调用业务对象的方法会报错。
所以,在 QWebChannel初始化回调函数 中调用业务对象的方法是最安全的。。

相关文档
  1. QML开发避坑指南(一):图像资源的加载
  2. QML开发避坑指南(二):加载https图像
  3. QML开发避坑指南(四):ImageProvider的使用
  4. QML开发避坑指南(五):QML常用类型

你可能感兴趣的:(#,Qt,#,开发笔记,QWebChannel,QML,QT)