从QML函数调用?

时间:2013-01-15 15:57:08

标签: qml blackberry-10 blackberry-cascades

我可以使用页面中的InvokeActionItem轻松共享项目,但我需要能够在listview项目中调用它。我已设法触发调用,但我无法弄清楚触发它时如何添加数据。我一直收到

的错误信息

InvocationPrivate :: setQuery:不允许更改InvokeQuery对象

注意:我试图用纯粹的QML来做这个,如果有必要,我会通过c ++来做,但QML会更好。

在Page对象内部运行的代码:

actions: [
    InvokeActionItem {
        ActionBar.placement: ActionBarPlacement.OnBar
        title: "Share"   
        query {
            mimeType: "text/plain"
            invokeActionId: "bb.action.SHARE"
        }

        onTriggered: {
            //myTextProperty is a string variable property for the page.
            data = myTextProperty;                
        }
    }
]

我试图在其他项目中使用的代码如下,但不起作用:

Container {
gestureHandlers: [
    TapHandler {
    LongPressHandler {
        onLongPressed: {
            console.log("Longpress");                

            invokeQuery.setData("test");

            invokeShare.trigger("bb.action.SHARE");
        }            
    }        

]

attachedObjects: [
    Invocation {
       id: invokeShare
       query: InvokeQuery {
           id:invokeQuery
           mimeType: "text/plain"         
       }   
    }
]
}

有没有办法只使用QML更改调用的数据,还是需要通过c ++运行它?

3 个答案:

答案 0 :(得分:11)

经过大量的浏览论坛和测试各种方法后,我终于找到了一个有效的方法。

在attachObjects中添加以下内容:

attachedObjects: [      
    Invocation {
       id: invokeShare
       query: InvokeQuery {
           id:invokeQuery
           mimeType: "text/plain"                        
       }
       onArmed: {
           if (invokeQuery.data != "") {
               trigger("bb.action.SHARE");
           }
       }             
    }
]

然后,只要您需要调用调用,请执行以下操作:

invokeQuery.mimeType = "text/plain"
invokeQuery.data = "mytext";
invokeQuery.updateQuery();

请注意,如果您没有检查onArmed for data,它会在创建时自动调用调用 - 对于listview,这可能导致20多个屏幕要求您在bbm上分享...;)

答案 1 :(得分:1)

您实际上可以使用InvokeActionItem,您只需调用updateQuery来重新触发invokeQuery。 当ListItemData更改时,绑定将导致值更新。

InvokeActionItem {
      enabled: recordItem.ListItem.data.videoId != undefined

      id: invokeAction
      query{ 
            uri: "http://www.youtube.com/watch?v=" + recordItem.ListItem.data.videoId
            onQueryChanged: {
                  updateQuery()
            }
      }

}

答案 2 :(得分:1)

对于删除" InvocationPrivate :: setQuery:不允许更改InvokeQuery对象"消息我用这个:

attachedObjects: [      
    Invocation {
        id: invoke
        query {
            mimeType: "text/plain"
            invokeTargetId: "sys.bbm.sharehandler"
            onDataChanged: {
                console.log("change data")
            }                   
        }
        onArmed: {
            if (invoke.query.data != "") {
                invoke.trigger("bb.action.SHARE");
            }
        } 
    }
]

function shareBBM(){
    invoke.query.setData("TEXT TO SHARE");
    invoke.query.updateQuery();
}