3

也许我误解了 Kendo 的 MVVM 实现的概念,但是......我有一个简单的 Kendo UI Mobile view,它是数据绑定到视图模型的:

var myViewModel = kendo.observable({
    myEntity: null,

    onViewShow: function (e) {
        var bindingEntity = myStaticDataSource[0];
        myViewModel.set("myEntity", bindingEntity);
    }
});

myStaticDataSource是作为简单 JavaScript 对象的“实体”的静态数组,具有类似nameor的字段description

视图及其输入字段绑定到视图模型:

<div data-role="view" data-layout="default" data-model="myViewModel" data-bind="events: { show: onViewShow }">
    <form>
        <ul data-role="listview" data-style="inset">
            <li>
                <label>
                    Name
                    <input type="text" data-bind="value: myEntity.name" />
                </label>
            </li>
        </ul>
    </form>
</div>

当用户更改输入字段时,name数据绑定视图模型实体中的相应字段(例如)会更新myEntity。但是:我所期望的是,实体myStaticDataSource也会更新,因为我没有克隆对象。但事实并非如此!它的价值保持在原始价值上。为什么是这样?我错过了关于 Kendo 的 MVVM 处理的一些东西吗?

4

1 回答 1

5

这是 Kendo Observable 对象和数组的副作用。ObservableObject当您使用该方法将属性分配给 an.set()时,它希望将该分配的项目也设为可观察的。您的项目myStaticDataSource可能是普通的 JS 对象而不是 Kendo Observables,因此 Kendo 为您将对象包装成一个新对象ObservableObject。这意味着对象不再相同。

这可能更有意义:

var items = [{name: "item one"}];
var vm = kendo.observable({item: undefined});
vm.set("item", items[0]);
vm.item === items[0]; // returns FALSE
items[0] instanceof kendo.data.ObservableObject // returns FALSE
vm.item instanceof kendo.data.ObservableObject // returns TRUE


var items = kendo.observable([{name: "item one"}]);
var vm = kendo.observable({item: undefined});
vm.set("item", items[0]);
vm.item === items[0]; // returns TRUE
items[0] instanceof kendo.data.ObservableObject // returns TRUE
vm.item instanceof kendo.data.ObservableObject // returns TRUE

对此的“修复”是执行以下任何一项:


制作myStaticDataSource剑道DataSource,这将使您放入其中的所有物品都变成ObservableObject.

var myStaticDataSource = new kendo.data.DataSource({
    data: [
        {name: "Bob"}
    ]
};

制作myStaticDataSource剑道ObservableArray,这将使您放入其中的所有物品都成为ObservableObject

var myStaticDataSource = kendo.observable([
    {name: "Bob"}
]);

使myStaticDataSource数组中的每个项目ObservableObject

var myStaticDataSource = [
    kendo.observable({name: "Bob"})
];
于 2014-10-15T14:02:18.537 回答