Polymer是否允许对数据绑定使用不同的标识定义?

时间:2014-07-22 16:38:04

标签: polymer

基于Polymer Data Binding文档中的"How data binding tracks template instances" section,听起来像JavaScript等式用于确定数据在模板调用之间是否“相同”。因此值类型具有值相等性,但是对象和数组使用引用相等性。如果我对一个返回一个对象数组的服务进行两次调用,并且其中一些对象在调用之间具有相同的值,那么将重新创建模板实例,因为数组和对象都被反序列化为不同的实例(我已经验证了这种行为)在版本0.3.3)。

是否可以指定与D3 employs a key function类似的身份功能?

1 个答案:

答案 0 :(得分:0)

我不知道是否有这样的事情,但我想出一个不同的解决方案。让我们假设您的代码看起来像这样(伪代码)

<ajax onResponse="{{onResponse}}" response="{{ajaxResponse}}" url="/users"></ajax>
<template repeat="{{user in ajaxResponse}}">
   <span>Hello from {{user.name}}</span>
</template>

如果我说得对,你说,当提出请求时,无论数据是否有变化,模板都会被重新评估。

为了解决这个问题,我们可以用不同的方式表示我们的数据,这种方式不是通过引用而是通过值来计算。

class UserListElement extends PolymerElement {

   @observable List userIds = toObservable([]);
   Map<int, Object> users = {};

   onResponse(var response) {
      users = {};
      for(var user in response) {
        users[user.id] = user;
        if (!users.contains(user.id)) userIds.add(user.id);
      }
      var toRemove = userIds.where((user) => !_userData.containsKey(user.id));
      for(var userId in toRemove) userIds.remove(userId);
   }
}

-

<ajax onResponse="{{onResponse}}" url="/users"></ajax>
<template repeat="{{userId in users}}">
   <span>Hello from {{users[userId].name}}</span>
</template>

正如我所说的非测试伪代码。但这是我能提出的唯一想法。