如何从listview bb10 qml中的listitemcomponents访问外部组件?

时间:2013-02-01 15:35:57

标签: qml blackberry-10 blackberry-cascades

我无法从ListItemComponent内部访问Datasource id。有人可以帮我解决这个问题吗?

ListItemComponent {
    type: "item"
    Container {
        id: listviewcontainer
        Container {
            preferredWidth: 768
            layout: StackLayout {
                orientation: LayoutOrientation.LeftToRight
            }
            CustomImageView {
                leftPadding: 10
                rightPadding: 10
                url: ListItemData.from_image
                horizontalAlignment: HorizontalAlignment.Left
                verticalAlignment: VerticalAlignment.Center
            }
            Container {
                preferredWidth: 538
                layout: StackLayout {
                    orientation: LayoutOrientation.TopToBottom
                }
                Container {
                    layout: StackLayout {
                        orientation: LayoutOrientation.LeftToRight
                    }
                    Label {
                        text: ListItemData.from
                        textStyle {
                            base: SystemDefaults.TextStyles.TitleText
                            color: Color.create("#2db6ff")
                        }
                    }
                    ImageView {
                        imageSource: "asset:///Home/img.png"
                        verticalAlignment: VerticalAlignment.Center
                    }
                }//Container
                Label {
                    text: ListItemData.message
                    multiline: true
                    textStyle {
                        base: SystemDefaults.TextStyles.SubtitleText
                    }
                    content {
                        flags: TextContentFlag.Emoticons
                    }
                }
                Label {
                    id: time
                    text: ListItemData.time
                    textStyle {
                        base: SystemDefaults.TextStyles.SmallText
                        color: Color.create("#666666")
                    }
                }
            }//Container
            ImageButton {
                id: delete_btn
                defaultImageSource: "asset:///Icon/delete.png"
                pressedImageSource: "asset:///Icon/delete.png"
                verticalAlignment: VerticalAlignment.Center
                horizontalAlignment: HorizontalAlignment.Right
                onClicked: {
                    deleteMessage(ListItemData.tid, ListItemData.uid);
                }
                function deleteMessage(tid, uid) {
                    var request = new XMLHttpRequest()
                    request.onreadystatechange = function() {
                        if (request.readyState == 4) {
                            var mResponse = request.responseText
                            mResponse = JSON.parse(mResponse)
                            var mResponseStatus = mResponse.response[0].receive.status;
                            var mMsg = mResponse.response[0].receive.message;
                            if (mResponseStatus == 1) {
                                msg_DataSource.source = "newurl.com" //   This line not works here..
                                msg_DataSource.load();              //   This line not works here..
                            } else if (mResponseStatus == 0) {
                            }
                        }
                    }// end function
                    request.open("GET", "myurl.com", true);
                    request.send();
                }// deleteMessage
            }//ImageButton
        }//Container
    }//Container
}//ListItemComponent

这里无法解决以下两行问题

msg_DataSource.source = "newurl.com" 
msg_DataSource.load();  

我尝试过如下,但这也无效

listviewcontainer.ListItem.view.dataModel.message_DataSource.source = "myurl.com";
listviewcontainer.ListItem.view.dataModel.message_DataSource.load();

或者

listviewcontainer.ListItem.view.dataModel.source = "myurl.com"; 
listviewcontainer.ListItem.view.dataModel.load();

2 个答案:

答案 0 :(得分:1)

使用以下代码将对象存储到全局变量的另一种最简单的方法,这对我来说很好。

         onCreationCompleted: {
         Qt.tabbedPane = tabbedPane;
         Qt.homeTab = homeTab;
        }   

这里我在页面创建时将tabbedPane存储在全局变量Qt.tabbedPane中Completed.Now我能够使用Qt.tabbedPane从ListItemComponent访问它。

希望它有所帮助。

答案 1 :(得分:0)

使数据模型可访问的最简单方法是向数据模型声明property alias,无论它在何处定义,例如在ListView QML文件中。这将使您的数据模型可以通过此property alias访问QML中的顶级组件。实际上,它为您提供了QML中其他任何地方的数据模型的全局参考。

例如,如果数据模型被称为msg_DataSource,那么在定义它的QML文件中,您可以创建如下属性别名:

property alias myDataModel: msg_DataSource

然后在ListItemComponent deleteMessage函数中,您可以像这样使用myDataModel

myDataModel.source = "newurl.com" 
myDataModel.load();

注意:我相信您也可以使用信号和插槽以更优雅的方式执行此操作,但这种方式应该更快更容易理解。