首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Vue状态与kendo数据源不同步。

Vue状态与kendo数据源不同步。
EN

Stack Overflow用户
提问于 2020-06-12 07:50:44
回答 2查看 622关注 0票数 0

我有一个kendo包装器网格,本地kendo数据源指向vue state。有一个按钮“更新”,它将更新状态,以便网格也将被更新和工作。

但是,如果我首先单击"Test“按钮(只是向state分配相同的值),然后单击"Update",奇怪的是,它不能工作,因此网格没有任何更改。

我最终发现原因是在单击"Test“然后"Update”之后,vue状态更新了,但是kendo网格数据源不会(意外地失去同步)。现在,临时解决方案是,我必须手动将状态分配给数据源,以便更新网格。

存储库:http://dojo.telerik.com/aGENIHuW

我的问题是,为什么在单击“Test”之后,kendo网格数据源会被缓存,并且与vue状态不同步?如果我不点击‘测试’,他们总是同步。只有当“相同的值分配”给状态时,才会出现问题。如果“不同的价值分配”,没有问题。

代码语言:javascript
复制
<div id="vueapp">
    <kendo-datasource ref="dsDS" :data="localDataSource"></kendo-datasource>
    <kendo-grid :data-source-ref="'dsDS'">
        <kendo-grid-column :field="'ProductID'"
                           :title="'ID'"
                           :width="40"></kendo-grid-column>
        <kendo-grid-column :field="'ProductName'"></kendo-grid-column>
        <kendo-grid-column :field="'UnitPrice'"
                           :title="'Unit Price'"
                           :width="120"
                           :format="'{0:c}'"></kendo-grid-column>
        <kendo-grid-column :field="'UnitsInStock'"
                           :title="'Units In Stock'"
                           :width="120"></kendo-grid-column>
        <kendo-grid-column :field="'Discontinued'" :width="120"></kendo-grid-column>
    </kendo-grid>
    <input type="button" value="Test" @click="test" />
    <input type="button" value="Update" @click="update" />
</div>
代码语言:javascript
复制
new Vue({
    el: '#vueapp',
    data: {
        localDataSource: [{
                "ProductID": 1,
                "ProductName": "Chai",
                "UnitPrice": 18,
                "UnitsInStock": 39,
                "Discontinued": false,
            },
            {
                "ProductID": 2,
                "ProductName": "Chang",
                "UnitPrice": 17,
                "UnitsInStock": 40,
                "Discontinued": false,
            },
            {
                "ProductID": 3,
                "ProductName": "Aniseed Syrup",
                "UnitPrice": 10,
                "UnitsInStock": 13,
                "Discontinued": false,
            }
        ]
    },
    methods: {
      test: function(e) {
        this.localDataSource = JSON.parse(JSON.stringify(this.localDataSource)); //same value assignment
        console.log('test');
      },
      update: function(e) {
        this.localDataSource.splice(0, 1, this.localDataSource[1]); //replace the first object with second object
      },
    }
})

更新:

让我强调我的问题如下:

为什么test2() + update() =>工作!

但是test() + update() =>不能工作

它们的不同之处只是test2()的值赋值'hello‘。

代码语言:javascript
复制
methods: {
    test: function(e) { //same value assignment
        let ds = JSON.parse(JSON.stringify(this.localDataSource));
        this.localDataSource = JSON.parse(JSON.stringify(ds));
    },
    test2: function(e) { //different value assignment
        let ds = JSON.parse(JSON.stringify(this.localDataSource));
        ds[0]['ProductName'] = 'hello';
        this.localDataSource = JSON.parse(JSON.stringify(ds));
    },
    update: function(e) {
        this.localDataSource.splice(0, 1, this.localDataSource[1]); //replace first row with second row
    }
}

http://dojo.telerik.com/aGENIHuW/10

EN

回答 2

Stack Overflow用户

发布于 2020-07-04 21:48:20

一旦在data()对象中设置了数据源,并且绑定了kendo网格,我就不会尝试编辑localDataSource对象。kendo网格获取基本数组并将其转换为包含所有扩展属性的kendo数据源,因此我将针对该新对象进行更改。

在update方法中尝试如下所示--如果您可以通过包装器属性为网格分配一个id,那么选择器将比我这里的更好。

代码语言:javascript
复制
    let gridDS = $("div[data-role=grid]").data("kendoGrid").dataSource;
    let data = gridDS.data();
    data.splice(0,1,data[1]);

顺便说一句,数据方法应该返回一个新对象,否则您可能会遇到重复组件共享同一个对象的问题,所以

代码语言:javascript
复制
    data:{
        localDataSource:[1,2,3]
    }

我会做

代码语言:javascript
复制
    data(){
        return {
            localDataSource:[1,2,3]
        }
    }
票数 0
EN

Stack Overflow用户

发布于 2020-07-09 17:30:16

添加它作为回答,因为注释不能容纳这么多的文本:

如果在update()函数:console.table(this.localDataSource)之后执行数据转储,您将看到localDataSource数组被正确更新。但剑道电网没有意识到这一点。它仍然有自己的数据数组。如果您对kendo数据源执行相应的转储,您将看到它没有被同步。

代码语言:javascript
复制
   let gridDS = $("div[data-role=grid]").data("kendoGrid").dataSource;
   let data = gridDS.data();
   console.table(data);

我认为正在发生的事情是这样的--因为localDataSource是data()的属性,Vue观察到对其嵌套属性的任何更改。当它执行代码时,ds[0]['ProductName'] = 'hello' Vue获取更新,查找对象上的依赖项,并重新绑定kendo组件。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62339856

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档