Почему ListElement может добавлять произвольные свойства?

Вы можете использовать ViewChild для получения первого элемента или директивы, соответствующей селектору из представления DOM. Если вид DOM изменения и новый дочерний элемент соответствует селектору, свойство будет обновлено.

 
 

component.ts

@ViewChild('addmanager') ref:ElementRef;
onChange($e){
  console.log($e);
 //set the input element clear 
  this.ref.itemsList['_selected']=[];
}

Посмотрите пример здесь: https://stackblitz.com/edit/ng-select-q46vpr

2
задан EastWhite 19 January 2019 в 13:29
поделиться

2 ответа

Позвольте мне ответить на мой вопрос!

Похоже, что использование ListElement в ListModel - это особенность языка .

Как указано в в Руководстве по ListElement :

Элементы списка определены , как и другие элементы QML , за исключением того, что они содержат набор определений ролей вместо свойств. , Использование того же синтаксиса , что и для определения свойств ...

В соответствии с этим, оказывается, что синтаксис ListElement {roleName: roleValue} в ListModel не будет определять экземпляр типа ListElement, но будет элементом List или список пункт из ListModel.

Я использовал следующие коды, чтобы доказать свою точку зрения.

QML:

import QtQuick 2.12
import QtQuick.Window 2.12

Window {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")
    ListModel {
        objectName: "model"
        ListElement {
            objectName: "element"
            name: "abc"
        }
    }
}

CPP:

#include <QAbstractListModel>
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QtDebug>
int main(int argc, char* argv[])
{

    QGuiApplication app(argc, argv);

    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

    if (engine.rootObjects().isEmpty())
        return -1;

    for(const auto &rootObject:engine.rootObjects())
    {
        auto model = rootObject->findChild<QAbstractListModel*>("model");
        qDebug() << model;
        qDebug() << rootObject->findChild<QObject*>("element");

        if(model)
        {
            qDebug() << model->roleNames();
        }
    }

    return app.exec();
}

Выходные сообщения:

QML debugging is enabled. Only use this in a safe environment.
QQmlListModel(0x26c4e7c1500, name = "model")
QObject(0x0)
QHash((1, "objectName")(0, "name"))

Видели? ListModel создает объект с именем model. Принимая во внимание, что ListElement не создал объект с именем element, но сделал две роли для объекта модели.

0
ответ дан EastWhite 19 January 2019 в 13:29
поделиться

Как следует из текста ошибки, если вы хотите определить свойства в C ++, вам нужно объявить его с помощью макроса Q_PROPERTY и предоставить методы для него ( http://doc.qt.io/qt-5/ properties.html ).

Вы также можете определить свойства в QML:

Test {
    property string name: "xxx"
}

ListElement name и age не произвольные свойства, а роли модели ( ссылка ).

0
ответ дан Sergei Ousynin 19 January 2019 в 13:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: