将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 // });
这个工作。这对我来说真的很困惑,因为我没有像我原来的例子那样扩展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
。
任何人都可以帮我理解这个吗?我让程序像我想要的那样工作,但是我非常困惑,我发现在不同的地方以不同的方式声明它们是非常钝的,我不喜欢它。随着时间的推移,它将使我的代码更难维护。
答案 0 :(得分:2)
由于你实际上有三个问题,我将把答案分成三部分。
在第一个示例中,将整个Prototype
包装为可观察对象。因此,剑道将确保其所有属性都是可观察的。您通过打印结果确认了这一点。这也提到on the kendo.observableObject docs:
重要说明:复杂字段会自动换行嵌套 ObservableObject实例。数组字段包装为 kendo.data.ObservableArray对象。孩子的变化事件 对象将冒泡到父ObservableObject。字段,名称 带有下划线的前缀不会被包裹。
在你的第二个例子中,我不知道$mutation.Conditions
是否是一个可观察的数组?在后一种情况下,这就是问题所在。它不会更新,因为您正在推送一个本机数组,它不会将其项目包装为可观察数据。如果是的话,我需要查看mutation
类的来源(假设你有这样的类?)。
您将kendo.observableHierarchy
分配给Parts
。因此,您无法将Parts
声明为any[]
,因为kendo.observableHierarchy
不是数组而是对象。您可以将Parts
声明为any
,但我想知道为什么您不会强烈输入您的代码?将其声明为observableArray
?
我希望这能揭开正在发生的事情的神秘面纱。