使用Kendo MVVM打字稿 - 要声明为Observable还是Not?

时间:2014-01-24 20:13:08

标签: kendo-ui typescript

Kendo MVVMTypescript一起使用已经非常愉快了,但我之前遇到了一个问题而且它又重新抬头......请参阅此问题以获取有关原始内容的详细信息。

Typescript with 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上的属性创建的,但是它不会变成一个observable。以下......

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

不会表现为可观察,也不会更新。我必须明确地这样做......

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

但是在向Mutations[]集合添加内容时,我通常不必执行此操作。我可以去...

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

一切都很好。

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

任何人都可以帮我理解这个吗?我让程序像我想要的那样工作,但是我非常困惑,我发现在不同的地方以不同的方式声明它们是非常钝的,我不喜欢它。随着时间的推移,它将使我的代码更难维护。

1 个答案:

答案 0 :(得分:2)

由于你实际上有三个问题,我将把答案分成三部分。

第1部分

在第一个示例中,将整个Prototype包装为可观察对象。因此,剑道将确保其所有属性都是可观察的。您通过打印结果确认了这一点。这也提到on the kendo.observableObject docs

  

重要说明:复杂字段会自动换行嵌套   ObservableObject实例。数组字段包装为   kendo.data.ObservableArray对象。孩子的变化事件   对象将冒泡到父ObservableObject。字段,名称   带有下划线的前缀不会被包裹。

第2部分

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

第3部分

您将kendo.observableHierarchy分配给Parts。因此,您无法将Parts声明为any[],因为kendo.observableHierarchy不是数组而是对象。您可以将Parts声明为any,但我想知道为什么您不会强烈输入您的代码?将其声明为observableArray

有什么问题

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