0

我想学习如何在 Kendo MVVM 中将页面上的输入绑定到数据源。首先,假设我有以下 html:

<div id="configDiv">
    Call:<input data-bind="value: SystemCall" type="text" /><br />
    <button data-bind="click: save">Save</button>
</div>

以及以下视图模型:

var self = this;

    var Model = kendo.data.Model.define({
        id: "SystemId",
        fields: {
            SystemCall: { editable: true }
        }
    });

        self.ViewModel = kendo.observable({
            dataSource: new kendo.data.DataSource({
                transport: {
                    read: "/api/ServiceApi?method=Ref/SystemConfig/",
                    type: "GET"
                },
                schema: {
                    model: Model
                }
            }),
            save: function (e) {
                alert("save config");
            },
        });
        kendo.bind($("#configDiv"), self.ViewModel);

这个想法是从读取的 url 以 json 格式返回的 SystemCall 的值将绑定到 html 中的输入字段。出了点问题,因为这不起作用。我在网上搜索了一个简单的例子来做比这更复杂的事情,但找不到。任何有关如何开始的帮助将不胜感激。

4

1 回答 1

2

我没有完整的工作示例可以分享,但我可以指出几件事。


Kendo DataSources 期望您的服务器返回一组项目,因此如果您的服务器返回单个对象,例如 JSON:

{
    "SystemId": 1,
    "SystemCall": "one"
}

那么它将不知道如何处理它,因为它不是一个数组。它期望类似:

[
    {
        "SystemId": 1,
        "SystemCall": "one"
    },
    {
        "SystemId": 2,
        "SystemCall": "two"
    }
]

您的 MVVM 绑定不起作用,因为您将其绑定到“SystemCall”,但您的 ViewModel 对象没有名为“SystemCall”的属性。那些将在其中的一项中ViewModel.dataSource


由于 DataSource 期望包含一组数据项,因此通常将其绑定到 ListView 或 Grid 小部件以显示每个数据项。ListView 中的每个行模板都可以具有该系统的输入元素。


在您的Model中,该id字段应包含在如下列表中fields

var Model = kendo.data.Model.define({
    id: "SystemId",
    fields: {
        SystemId: { type: "number" }, // assuming this is a number.
        SystemCall: { editable: true }
    }
});

我知道这不是一个完整的答案,但我希望这至少能让你朝着正确的方向前进......

于 2014-07-16T14:18:25.413 回答