vue.js - Vue 状态不与 kendo 数据源同步
问题描述
我有一个kendo 包装网格,其中本地kendo 数据源指向vue state。有一个“更新”按钮将更新状态,以便网格也将更新并且它可以工作。
但是,如果我首先单击按钮“测试”(只是对状态进行相同的赋值)然后单击“更新”,奇怪的是它不起作用,所以网格没有变化。
我终于发现原因是单击“测试”然后“更新”后,vue 状态更新但剑道网格数据源不会(意外不同步)。现在临时解决方案是我必须手动将状态分配给数据源,以便更新网格。
回购:http ://dojo.telerik.com/aGENIHuW
我的问题是,为什么在单击“测试”后,剑道网格数据源被缓存并且与 vue 状态不同步?如果我不点击“测试”,它们总是会同步。仅当对状态进行“相同的值分配”时才会出现问题。如果“不同的赋值”,没问题。
<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>
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() 的值分配“你好”
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
}
}
解决方案
一旦在 data() 对象中设置了数据源,并且绑定了剑道网格,我就不会尝试编辑 localDataSource 对象。剑道网格获取您的基本数组并将其转换为具有所有扩展属性的剑道数据源,因此我将针对该新对象进行更改。
在您的更新方法中尝试以下类似的方法 - 如果您可以通过包装器属性为网格分配一个 id,那么选择器会比我这里的更好
let gridDS = $("div[data-role=grid]").data("kendoGrid").dataSource;
let data = gridDS.data();
data.splice(0,1,data[1]);
顺便说一句,数据方法应该返回一个新对象,否则您可能会遇到重复组件共享同一对象的问题,而不是
data:{
localDataSource:[1,2,3]
}
我会做
data(){
return {
localDataSource:[1,2,3]
}
}
推荐阅读
- swift - 标题视图未在第 0 部分显示
- java - 没有 else 语句的中断
- javascript - 有没有办法解构传递给函数 onClick 的数据属性?
- swift - 表格视图高度未正确设置动画
- azure - 迁移到 Azure VM 时在 IIS 上启用 NUMA
- c# - 如何从模型列表中删除特定字段
- prometheus - Prometheus Query - irate() 中使用的数字范围是否有限制?
- javascript - Highcharts - 桑基图 - 如何将一些系列数据标签名称显示为图标或其他名称
- ios - 具有透明背景的 SwiftUI NavigationView
- c# - EF Core:AutoMapper ProjectTo ToListAsync 抛出“对象引用未设置为对象的实例”