Typescript с Kendo MVVM — объявлять наблюдаемым или нет?

Использование Kendo MVVM с Typescript было в основном приятным, но я уже сталкивался с проблемой, и она снова поднимает голову... Подробнее об оригинале см. в этом вопросе.

Typescript с Kendo MVVM

Общая проблема заключалась в том, что мне нужно было определить массив как kendo.data.ObservableArray. Теперь вот проблема, с которой я столкнулся...

Я не понимаю, когда я должен объявить свойство наблюдаемым или просто оставить его как обычно и позволить процессу быть естественным. На самом деле я серьезно запутался во всем испытании. Чтобы привести пример ...

export class Prototype  {
    public Editing: boolean = false;
    public Id: string = "";
    public Name: string = "";
    public Mutations: any[] = [];
    public Tags: any[] = [];
    public Conditions: any[] = [];

    };
}

var viewModel = kendo.observable(new Prototype());
viewModel.Mutations.push({ // new data // });

Это работает. Меня это ДЕЙСТВИТЕЛЬНО сбивает с толку, потому что я не расширил ObservableObject, как в исходном примере. Если я распечатаю модель представления, я увижу, что все массивы были преобразованы в ObservableArray, что мне и нужно.

Но потом у меня похожая ситуация с более вложенной частью программы...

export class Condition {
    public Label: string = "Pushed Condition";
    public Parts: observableArray = kendo.observableHierarchy([]);

    constructor(data?: any, mapped?: any) {
        for (name in mapped) {
            this[name] = mapped[name];
        }

        for (name in data) {
            this[name] = data[name];
        }
    }

    public onRemove(e) {
        e.data.parent().remove(e);
    }

    public Push(data: any) {
        data.onRemove = e => {
            e.data.parent().remove(e);
        };
        this.Parts.push(data);
    }
}

Вот тут-то мне и мозг вышибло. Один из этих объектов создается как свойство в ObservableArray, но затем НЕ превращается в наблюдаемое. Итак, следующее...

$mutation.Conditions.push(new Condition());

не ведет себя как наблюдаемый и не обновляется. Я должен явно сделать это как...

$mutation.Conditions.push(kendo.observable(new Condition()));

Но обычно мне не приходится этого делать, когда я добавляю что-то в коллекцию Mutations[]. Я могу просто пойти...

viewModel.Mutations.push(new Mutation());

и все в порядке.

Это еще больше сбивает с толку с массивом Parts Condition. Если я объявлю его как any[], это не сработает, даже если я создам условие с kendo.observable. Единственный способ, которым я смог заставить его работать, - это явно объявить его как ObservableArray.

Может ли кто-нибудь помочь мне понять это? У меня есть программа, работающая так, как я хочу, но я сильно запутался, и я считаю, что объявлять их по-разному в разных местах действительно тупым, и мне это не нравится. Со временем мой код будет намного сложнее поддерживать.


person Ciel    schedule 24.01.2014    source источник
comment
В вашем примере viewModel имеет тип kendo.observable. Каков тип $mutation ?   -  person Jose Basilio    schedule 28.01.2014
comment
Это просто стандартный объект javascript; Это часть того, что меня смущает. Когда я помещаю стандартный объект в observableArray, он превращает его в наблюдаемое, но если я объявлю его как фактическое наблюдаемое, это не сработает.   -  person Ciel    schedule 28.01.2014
comment
так $mutation не создается как kendo.observable(new Prototype());? есть ли шанс, что вы сможете скопировать соответствующие части вашего кода в пример проекта, с которым мы могли бы поиграть?   -  person Lars Höppner    schedule 28.01.2014


Ответы (1)


Поскольку у вас на самом деле три вопроса, я разделю свой ответ на три части.

Часть 1

В вашем первом примере вы обертываете весь Prototype как наблюдаемый. Следовательно, кендо также позаботится о том, чтобы все его свойства были наблюдаемыми. Вы подтвердили это, распечатав результат. Это также упоминается в документах kendo.observableObject:

Важно: сложные поля автоматически заключаются во вложенные экземпляры ObservableObject. Поля массива упакованы как объекты kendo.data.ObservableArray. Событие изменения дочерних объектов будет всплывать к родительскому ObservableObject. Поля, имя которых начинается со знака подчеркивания, переноситься не будут.

Часть 2

Во втором примере я не могу сказать, является ли $mutation.Conditions наблюдаемым массивом или нет? В последнем случае это проблема. Он не будет обновляться, потому что вы нажимаете на собственный массив, который не будет обертывать его элементы как наблюдаемые. Если это так, мне нужно просмотреть исходники класса mutation (при условии, что у вас есть такой класс?).

Часть 3

Вы назначаете kendo.observableHierarchy на Parts. Таким образом, вы не можете объявить Parts как any[], потому что kendo.observableHierarchy — это не массив, а объект. Вы можете объявить Parts как any, но мне интересно, почему бы вам не напечатать свой код строго? Что не так с объявлением его как observableArray?

Надеюсь, это демистифицирует происходящее.

person thomaux    schedule 28.01.2014
comment
Немного. Настоящая проблема, с которой я сталкиваюсь, заключается в том, чтобы выяснить, насколько глубоко Кендо будет преобразовывать обычные объекты в наблюдаемые, если корневая модель будет превращена в наблюдаемую. Проблема в том, что это не кажется последовательным, и это сбивает меня с толку. - person Ciel; 28.01.2014
comment
Из документов я предполагаю, что каждый раз, когда Кендо заключает сложное свойство в ObservableObject, к этому объекту будет снова применяться одно и то же правило. Поэтому я предполагаю, что это работает рекурсивно. - person thomaux; 28.01.2014
comment
Так что нет ничего плохого в том, чтобы уже объявить что-то наблюдаемым массивом? даже если он попытается автоматически обернуть его позже? - person Ciel; 28.01.2014
comment
Нет, это не проблема. Кендо заметит, что он уже является наблюдаемым, и, следовательно, не будет пытаться обернуть его снова. - person thomaux; 29.01.2014
comment
Conditions: [] — это наблюдаемый массив, потому что это свойство Prototype, которое в начале было заключено в kendo.observable. Это именно проблема. Я также не могу сказать, какого поведения ожидать. Объявление их наблюдаемыми в коде does.not.work. Это не дает желаемых результатов; Вообще. Это вызывает все виды чрезвычайно неудобного поведения с привязками и далеко не применимо в любом случае. - person Ciel; 03.02.2014