使用Kendo的MVVM框架,我想要扩展使用kendo.data.Model.define
创建的基础对象以包含新属性,例如...
所以我想要定义一个新属性,例如,只调用newProperty
,默认情况下它是true
,除非另有说明。
var Model = kendo.data.Model.define({
Id: "Id",
fields: {
Id: {
type: "string"
},
Name: {
type: "string"
},
Quality: {
newProperty: false,
defaultValue: {
Id: "qualities/none",
Name: "None",
CSS: "none",
Order: 0
}
}
});
所以我会像这样创建视图模型......
var viewModel = new Model({
Id: null,
Name: null,
Quality: {}
});
console.log(viewModel.Name.newProperty); // expected to be true (default)
console.log(viewModel.Quality.newProperty); // expected to be false
它不会阻止我这样做,但是属性值不会传递给从该模型创建的新视图模型。有没有办法做到这一点?
我想这样做的原因是因为我希望尽可能多地重复使用代码,并使各个页面的实际代码尽可能简洁明了。我打算在其他地方定义我的“模型”,并且它们将具有许多行为所需的基础逻辑。然后在我需要使用它们的页面中,只需将它们作为实例调用(就像在kendo示例上一样)并使它们非常简单和平坦。我认为定义模型的“模式”比尝试在每个实现上正确使用它更加可靠。
答案 0 :(得分:2)
这对于默认实现是不可能的,所以我认为你必须自己构建它。根据具体要求,可能会变得复杂。您的示例也有点令人困惑,因为您尝试在字符串类型的字段上访问newProperty
- 只有对象可以具有此类属性。我想你可以在一个单独的结构中存储字符串,数字等的这种属性。
只要在对象上拥有属性就足够了,并且在新建模型时不需要传递值,这样的事情可能会起作用:
// keep a reference to the original init method
kendo.data.ObservableObject.fn._myInit = kendo.data.ObservableObject.fn.init;
// override it
kendo.data.ObservableObject.fn.init = function (value) {
var member,
field;
kendo.data.ObservableObject.fn._myInit.call(this, value);
for (field in value) {
// add default properties ...
if (!this[field].hasOwnProperty("newProperty")) {
this[field].newProperty = true;
}
if (!this[field].hasOwnProperty("otherProperty")) {
this[field].otherProperty = "something or other";
}
}
}
var Model = kendo.data.Model.define({
Id: "Id",
fields: {
Id: {
type: "string"
},
Name: {
defaultValue: {
Value: "John Doe"
}
},
Quality: {
defaultValue: {
Id: "qualities/none",
Name: "None",
CSS: "none",
Order: 0,
newProperty: false
}
}
}
});
var modelInstance = new Model();
modelInstance.set("Id", "abcde");
console.log(modelInstance.get("Quality.newProperty")); // false: as set in Model.define
console.log(modelInstance.get("Name.newProperty")); // default: true
console.log(modelInstance.get("Id.newProperty")); // fails because string type, not object
这将添加默认属性,而不是通过Model.define指定的。
对于更复杂的行为,您可能必须编写自己的Model.define方法和/或重写ObservableObject。