基于Polymer Data Binding文档中的"How data binding tracks template instances" section,听起来像JavaScript等式用于确定数据在模板调用之间是否“相同”。因此值类型具有值相等性,但是对象和数组使用引用相等性。如果我对一个返回一个对象数组的服务进行两次调用,并且其中一些对象在调用之间具有相同的值,那么将重新创建模板实例,因为数组和对象都被反序列化为不同的实例(我已经验证了这种行为)在版本0.3.3)。
是否可以指定与D3 employs a key function类似的身份功能?
答案 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>
正如我所说的非测试伪代码。但这是我能提出的唯一想法。