Kendo ui 带Kendo MVVM的Typescript-是否声明为可观察?

Kendo ui 带Kendo MVVM的Typescript-是否声明为可观察?,kendo-ui,typescript,Kendo Ui,Typescript,将Kendo MVVM与Typescript一起使用一直都很愉快,但我以前遇到过一个问题,它又抬头了。。。有关原始版本的更多详细信息,请参见此问题 一般的问题是,我需要将数组定义为kendo.data.ObservableArray。现在我遇到的问题是 我不明白什么时候我应该声明一个属性是可观察的,或者只是让它保持正常,让过程变得自然。事实上,我对整个折磨感到非常困惑。举个例子 export class Prototype { public Editing: boolean = fal

Kendo MVVM
Typescript
一起使用一直都很愉快,但我以前遇到过一个问题,它又抬头了。。。有关原始版本的更多详细信息,请参见此问题

一般的问题是,我需要将数组定义为
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 // });
这很有效。这让我很困惑,因为我没有像我最初的例子那样扩展
observateObject
。如果我打印出视图模型,我可以看到所有数组都转换为
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);
    }
}
现在,这就是我的大脑完全崩溃的地方。其中一个对象被创建为ObservalArray上的属性,但它不会变成ObservalArray。所以下面

$mutation.Conditions.push(new Condition());
不会表现为可观察,也不会更新。我必须明确地这样做,因为

$mutation.Conditions.push(kendo.observable(new Condition()));
但是在向
translations[]
集合添加某些内容时,我通常不必这样做。我可以走了

viewModel.Mutations.push(new Mutation());
一切都很好

它进一步混淆了条件的
部分
数组。如果我将其声明为
any[]
,则它不起作用-即使我使用
kendo.observable
创建了条件。我能够使它工作的唯一方法是显式地将它声明为
ObservableArray


谁能帮我弄明白这一点吗?我让程序按我想要的方式运行,但我感到非常困惑,我发现在不同的地方以不同的方式声明这些是非常愚蠢的,我不喜欢它。随着时间的推移,这将使我的代码更难维护。

由于您实际上有三个问题,我将把我的答案分为三部分

第一部分 在第一个示例中,您将整个
原型
包装为可观察对象。因此,剑道将确保其所有属性也是可观察的。您通过打印结果确认了这一点。其中还提到:

重要提示:复杂字段将自动包装为嵌套字段 ObservieObject实例。数组字段包装为 kendo.data.observearray对象。孩子的变化事件 对象将冒泡到父ObserveObject。字段,哪个名称 前缀为下划线的将不会被包装

第二部分 在第二个示例中,我无法判断
$mutation.Conditions
是否为可观察数组?在后一种情况下,这就是问题所在。它不会更新,因为您正在推送到一个本机数组,该数组不会将其项包装为可观察项。如果是这样的话,我需要查看
变异
类的来源(假设你有这样一个类?)

第三部分 您将一个
剑道.observehierarchy
分配给
部分
。因此,您不能将
部分
声明为
任何[]
,因为
剑道.observehierarchy
不是数组而是对象。您可以将
部分
声明为
任何
,但我想知道您为什么不强式键入代码?将其声明为
observearray
有什么不对


我希望这能揭开发生的事情的神秘面纱。

在您的示例中,viewModel是kendo.observable类型。$mutation的类型是什么?它只是一个标准的javascript对象;这是让我困惑的一部分。当我把一个标准对象推到一个
observableArray
上时,它会把它变成一个可观察的对象——但是如果我把它声明为一个实际的可观察对象,它就不起作用了。所以$mutation不会被创建为
kendo.observable(newprototype())?您是否有可能将代码的相关部分复制到我们可以使用的示例项目中?稍微。我面临的真正问题是,如果根模型变成可观察的,那么有多少层深剑道会将普通对象转化为可观察的对象。问题是它似乎不一致,这让我很困惑。从文档中我假设每次Kendo将复杂属性包装到
observeObject
中时,相同的规则都会再次应用到该对象。所以我假设它是递归工作的,那么将某个东西声明为可观察数组并没有什么害处?即使它试图在以后自动包装它?不,这不是问题。剑道会注意到它已经是一个可观察的,因此不会再尝试包装它。
条件:[]
是一个可观察的数组,因为它是
Prototype
上的一个属性,它在一开始就包装在
Kendo.observatable
中。这正是问题所在。我也不知道预期的行为是什么。在代码
中将它们声明为可观察的不会.not.work
。它不能产生预期的结果;完全它会导致绑定出现各种非常尴尬的行为,并且在任何方面都远远没有可用性。