困难剑道UI MVVM和关联数组(Difficulty with Kendo UI MVVM and

2019-10-20 10:44发布

我有困难的时候结合使用的“关联数组”与剑道UI的MVVM视图模型。 我已经尝试合并演示在一起,但是真的很难,当我没有连半工作的一个走下车的。 但是,这是我已经成功的最好...这里是我的代码,用jsBin证明一起。 它只是似乎并不像一个关联数组的想法,我真的不特定怎么回事挂接到它。

究其原因,关联数组是因为我拉了很多的细节出来的数据库,但他们将需要通过名称某些地方被调用。 而不是写一堆搜索/分选方法的,关联数组是用于这个简单得多。 但在一些地方,我只是需要列出数据,顾左右而言他,这是给我带来很大的麻烦。

jsBin演示

使用Javascript

var viewModel = new kendo.data.ObservableObject({
  Id: "test/id",
  Associative: new kendo.data.ObservableArray([])
});

var array = viewModel.get("Associative");

array["One"] = { Id: "id/one" };
array["Two"] = { Id: "id/two" };
array["Three"] = { Id: "id/three" };

kendo.bind('body', viewModel);

HTML

<div data-bind="text: Id"></div>
<div data-template="display-associative-many" data-bind="source: Associative"></div>

<script type="text/x-kendo-template" id="display-associaite-many">
  <div>
    ${ data.Id }
  </div>
</script>

更新

我需要绑定到被存储在数据RavenDB作为IDictionary<string, T>其中T是特定种类的对象的(它种变化在时间,所以不能给你一个具体类型-也不是真正相关)

因此,它被保存在如数据库...

"Model" : {
   "ONE" : {
      "Id" : "id/one"
   },
   "TWO" : {
      "Id" : "id/two"
   },
   "THREE" : {
      "Id" : "id/three"
   }
}

显然,还有比这更多的数据,但是这一切是目前真正意义。

虽然必须改变这种物理能力,这是违背程序的其他许多地方。 很多在这是一本字典的前提下,已经在软件工作各个地方的。 所以我 ,以避免可能的话改变了这一切。 如果这是真的,真正使这项工作在所有的唯一途径,我会做出改变。

有什么我可以做,虽然是做一些映射,当它进行反序列化。 我想现在是分配key到一个新的属性, Name ,并尝试剑道都绑定到。 因此,数据可能会,如果我的精神形象是正确的?

Associative: [
   "One" : {
      Name: "One",
      Id: "id/one"
   },
   "Two" : {
     Name: "Two",
     Id: "id/two"
   },
   "Three" : {
     Name: "Three",
     Id: "id/three"
   }
]

如果我没有理解剑道的observable系统的权利,这将使它...

kendo.data.ObservableArray([
   kendo.data.ObservableObject,
   kendo.data.ObservableObject,
   kendo.data.ObservableObject
])

当我抓住它,这应该是可以对模型绑定...对不对?

更新2

按照我自己的想法,我已经做了一定程度的成功版本的工作,这种方法......不过,我不能完全肯定这是否是安全的或有效的。 我越来越多关注的性能。 我还在试图寻找其他方式来实现这一结果。

剑道模板

<script type="text/x-kendo-template" id="display-items-many">
        # for(var key in data) { #
        #   if (data.hasOwnProperty(key) && data[key].hasOwnProperty("Id")) { #
        <tr>
            <td>
                <strong>#= data[key].Id #</strong>
            </td>
            <td class="text-right">
                <code>#= data[key].Total #</code>
            </td>
        </tr>
        #   } #
        # } #
</script>

HTML

<table class="table borderless table-hover table-condensed" data-bind="source: Associative  data-template="display-items-many">

</table>

Answer 1:

首先,你的模板名称是错误的:

data-template="display-associaitive-many"
           id="display-associaite-many"

其次,JavaScript数组不起作用这样。

纯JS(不涉及剑道):

var array = [];
array["One"] = { Id: "id/one" };
array["Two"] = { Id: "id/two" };
array["Three"] = { Id: "id/three" };

array; // prints "[]"
array.length; // prints 0

关联数组应当表示为对象http://www.laurencegellert.com/2012/01/associative-arrays-in-javascript/然后可以包装成一个剑道ObservableObject 。 然而,这意味着它是不是真的有一个长的数组,所以你不能把它绑定到一个剑道的ListView。

关闭我的头顶部,我能想到的唯一的方式来表示,作为一个关联数组(对象),并且仍然将其绑定到ListView将您的ListView绑定到一个函数,然后转换你的对象到一个数组。 跟踪更改变得有点怪异那么虽然...


在回答您的意见和更新原帖:

我打字这个从我的头顶,所以我的道歉,如果你直接复制/粘贴它不工作,但假设你有一个DataSource贴膜的数据,你可以使用schema.parse方法把你的数据转换成一个实际的阵列,如:

var _parseTheData = function (data) {
  var array = [];
  var item;
  for(var name in data) {
    item = data[name];
    item.Name = name;
    array.push(item);
  }
  return array;
};

var ds = new kendo.data.DataSource({
  transport: {
    read: {
      url: "http://wherever.com/theData"
    },
    schema: {
      parse: _parseTheData
    }
  }
});

我们的想法是,如果你的服务器返回的对象:

{
   "ONE" : {
      "Id" : "id/one"
   },
   "TWO" : {
      "Id" : "id/two"
   },
   "THREE" : {
      "Id" : "id/three"
   }
}

然后解析函数将其转换为数组:

[
   {
      "Id" : "id/one",
      "Name" : "ONE"
   },
   {
      "Id" : "id/two",
      "Name" : "TWO"
   },
   {
      "Id" : "id/three",
      "Name" : "THREE"
   }
]

然后您可以MVVM绑定到像正常的Widget。 例如ListLiew:

<div data-role="listview"
     data-bind="source: ds"
     data-template="item-template"></div>

<script id="item-template" type="text/x-kendo-template">
    <div data-bind="text: Name"></div>
    <div data-bind="text: Id"></div>
</script>


文章来源: Difficulty with Kendo UI MVVM and an Associative Array