1

so I'm new to the world of BB developement, QML, and C++ so please bear with me as I try to explain my issue.

I'm in the process of making an application that will seach for people from some far away API that returns an XML file that I will then parse and show the information in a list.

So in the first page I have two textfields that take in first name and last name. I also have a button that goes to the results page and is supposed to also send along the URL for contacting the API. Here's the code for the first page:

import bb.cascades 1.0

NavigationPane {
    id: nav
    Page {
        content: Container {
            TextField {
                id: firstName
                hintText: "First Name"

                inputMode: TextFieldInputMode.Text
                input {
                    flags: TextInputFlag.PredictionOff | TextInputFlag.AutoCorrectionOff
                }

                validator: Validator {
                    id: firstNameValidator
                    mode: ValidationMode.Immediate
                    errorMessage: "You must enter at least three characters."

                    onValidate: {
                        if (firstName.text.length >= 3 || firstName.text.length == 0)
                            state = ValidationState.Valid;
                        else
                            state = ValidationState.Invalid;
                    }
                }
            }

            TextField {
                id: lastName
                hintText: "Last Name"

                inputMode: TextAreaInputMode.Text
                input {
                    flags: TextInputFlag.PredictionOff | TextInputFlag.AutoCorrectionOff

                    onSubmitted: {
                        if (firstNameValidator.state == ValidationState.Valid
                            && lastNameValidator.state == ValidationState.Valid) {
                            theButton.text = "Valid enter!"
                        } else {
                            theButton.text = "Invalid enter!!!!"
                        }
                    }
                }

                validator: Validator {
                    id: lastNameValidator
                    mode: ValidationMode.Immediate
                    errorMessage: "You must enter at least three characters."

                    onValidate: {
                        if (lastName.text.length >= 3 || lastName.text.length == 0)
                            state = ValidationState.Valid;
                        else
                            state = ValidationState.Invalid;
                    }
                }
            }

            Button {
                id: theButton
                text: "Search"

                onClicked: {
                    if (firstNameValidator.state == ValidationState.Valid
                        && lastNameValidator.state == ValidationState.Valid) {
                        text = "Valid button press!"
                        pushed.theUrl = link to url
                        pushed.dataSource.source = link to url
                        nav.push(pushed)
                    } else {
                        text = "Invalid button press!!!"
                    }
                }
            }
        }
    }
    attachedObjects: [
        AdvancedResult {
            id: pushed
        }
    ]
}

And here's the code for the second page:

import bb.cascades 1.0
import bb.data 1.0

Page {
    property string theUrl
    property alias dataSource: dataSource
    content: ListView {
        id: myListView

        // Associate the list view with the data model that's defined in the
        // attachedObjects list
        dataModel: dataModel

        listItemComponents: [
            ListItemComponent {
                type: "item"

                // Use a standard list item to display the data in the data
                // model
                StandardListItem {
                    imageSpaceReserved: false
                    title: ListItemData.FIRST + " " + ListItemData.LAST
                    description: ListItemData.JOB
                    status: ListItemData.PHONE
                }
            }
        ]
        onTriggered: {
            var selectedItem = dataModel.data(indexPath);
            // Do something with the item that was tapped
        }
    }

    attachedObjects: [
        GroupDataModel {
            id: dataModel
            grouping: ItemGrouping.None
        },
        DataSource {
            id: dataSource

            // Load the XML data from a remote data source, specifying that the
            // "item" data items should be loaded
            source: theUrl
            query: some query
            type: DataSourceType.Xml

            onDataLoaded: {
                // After the data is loaded, clear any existing items in the data
                // model and populate it with the new data
                dataModel.clear();
                if (data[0] == undefined) {
                    dataModel.insert(data);
                } else {
                    dataModel.insertList(data);
                }
            }
        }
    ]

    onCreationCompleted: {
        // When the top-level Page is created, direct the data source to start
        // loading data
        dataSource.load();
    }
}

As you can see in the first page, I try attaching the source for the data source object in two different ways: by pushing it directly to the global string theURL and by pushing it directly to the source variable of the datasource object but both ways don't seem to be working. What am I doing wrong? This is driving me crazy as I haven't been able to figure it out yet it seems like such an easy answer.


EDIT: Okay this is seriously so unintuitive! So I was able to fix it by simply adding theUrl: "link to url" under the "pushed" object in the main page and for the second page on the top adding "property string theUrl: gibberish". But now that I'm trying to make it so that the url is different depending on the user input, it just doesn't work.

So here's the current code I have so far:

import bb.cascades 1.0

NavigationPane {
    id: nav
    property string firstName: ""
    property string lastName: ""
    property string jobTitle: ""
    property string test: url1
    Page {
        content: Container {
            TextField {
                id: firstNameField
                hintText: "First Name"

                inputMode: TextFieldInputMode.Text
                input {
                    flags: TextInputFlag.PredictionOff | TextInputFlag.AutoCorrectionOff
                }

                validator: Validator {
                    id: firstNameValidator
                    mode: ValidationMode.Immediate
                    errorMessage: "You must enter at least three characters."

                    onValidate: {
                        if (firstNameField.text.length >= 3 || firstNameField.text.length == 0) {
                            state = ValidationState.Valid;
                            firstName = firstNameField.text;
                        } else {
                            state = ValidationState.Invalid;
                        }
                    }
                }
            }

            TextField {
                id: lastNameField
                hintText: "Last Name"

                inputMode: TextAreaInputMode.Text
                input {
                    flags: TextInputFlag.PredictionOff | TextInputFlag.AutoCorrectionOff

                    onSubmitted: {
                        if (firstNameValidator.state == ValidationState.Valid
                            && lastNameValidator.state == ValidationState.Valid) {
                            theButton.text = "Valid enter!"
                        } else {
                            theButton.text = "Invalid enter!!!!"
                        }
                    }
                }

                validator: Validator {
                    id: lastNameValidator
                    mode: ValidationMode.Immediate
                    errorMessage: "You must enter at least three characters."

                    onValidate: {
                        if (lastNameField.text.length >= 3 || lastNameField.text.length == 0) {
                            state = ValidationState.Valid;
                            lastName = lastNameField.text;
                        } else {
                            state = ValidationState.Invalid;
                        }
                    }
                }
            }

            Button {
                id: theButton
                text: "Search"

                onClicked: {
                    if (firstNameValidator.state == ValidationState.Valid
                        && lastNameValidator.state == ValidationState.Valid) {
                        //text = "Valid button press!"
                        pushed.theUrl = url2
                        text = pushed.theUrl;
                        nav.push(pushed)
                    } else {
                        text = "Invalid button press!!!"
                    }
                }
            }
        }
    }
    attachedObjects: [
        AdvancedResult {
            id: pushed
            theUrl: test
        }
    ]
}

So I'm currently using two different urls for testing: url1 and url2. url1 is set to test and test is set to theUrl under pushed. That works fine but when i add the line pushed.theUrl = url2; the page still returns the result for url1. So what I did is add the line text = pushed.theUrl; for testing purposes where "text" is the text shown on the button and when I run the app, even though it doesn't return to me a page, "text" is in fact set to url2 meaning that pushed.theUrl is url2. This has all been very unintuitive and not an enjoyable experience at all so far. What I'm trying to do here (get the input from a textfield, add it to a link and send it off to another page) would have taken me an hour at most on Android to code.

Jonathan N
  • 33
  • 6

0 Answers0