Kendo UI模型 - 扩展"定义"有新属性?

时间:2013-11-30 01:26:07

标签: kendo-ui

使用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示例上一样)并使它们非常简单和平坦。我认为定义模型的“模式”比尝试在每个实现上正确使用它更加可靠。

1 个答案:

答案 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。