- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
通过 Polymer 显示 json 对象数组中的 html 表。
无法将 json 数据与消息绑定(bind):Polymer::Attributes:无法将数组解码为 JSON
使用iron-ajax或直接使用ajax记录上面相同的消息,此测试的结果是直接使用ajax绕过iron-ajax可能出现的问题。问题是将 Web 服务返回的 json 绑定(bind)到 Polymer 转发器。
<polymer-element name="fixtures-list">
<!-- <iron-ajax auto id="matchesService" verbose="true"
params='{{ajaxParams}}'
url="http://localhost:20440/MatchesService.svc/matches/GetAllForTeamInSeason"
handle-as="json"
method="GET"
on-request="handleRequestSent"
on-response="handleResponseReceived"
on-error="handleError"
last-response="{{matches}}"
debounce-duration="300"></iron-ajax>-->
<table class="table table-responsive">
<thead>
<tr>
<th>Date</th>
<th><abbr title="Kick Off">KO</abbr>/Result</th>
<th></th>
<th>Opponent</th>
<th>Venue</th>
<th><abbr title="Competition">Comp</abbr></th>
<th><abbr title="Televised">TV</abbr>/<abbr title="Attendance">ATT</abbr></th>
</tr>
</thead>
<tbody>
<template is="dom-repeat" items="{{matches}}">
<tr>
<td>{{KickOff}}</td>
<td>
<template if="{{IsResult}}">
{{Result}}
</template>
<template if="{{!IsResult}}">
{{KickOff}}
</template>
</td>
<td>{{Result}}</td>
<td>{{OpponentNameShort}}</td>
<td>{{Venue}}</td>
<td>{{EventAbbreviations}}</td>
<td>
<template if="{{IsResult}}">
{{Attendance}}
</template>
<template if="{{!IsResult}}">
{{BroadcasterAbbreviations}}
</template>
</td>
</tr>
</template>
</tbody>
</table>
<script>
Polymer({
is: 'fixtures-list',
properties: {
siteid: {
type: Number,
value: -1,
notify: true,
reflectToAttribute: true,
observer: 'logChange'
},
teamid: {
type: Number,
value: -1,
notify: true,
reflectToAttribute: true,
observer: 'logChange'
},
seasonid: {
type: Number,
value: -1,
notify: true,
reflectToAttribute: true,
observer: 'logChange'
},
ajaxParams: {
type: Object,
computed: 'processParams(siteid, teamid, seasonid)'
}
},
matches: [],
ready: function () {
console.log('polymer element ready');
$.ajax({
url: 'http://localhost:20440/MatchesService.svc/matches/GetAllForTeamInSeason',
data: {
siteId: this.siteid,
teamId: this.teamid,
seasonId: this.seasonid
},
error: function () {
console.log('ajax error');
},
dataType: 'json',
success: function (data) {
//console.log(JSON.parse(data));
this.matches = data;
},
type: 'GET'
});
},
processParams: function(siteid, teamid, seasonid) {
console.log('processParams: ' + siteid + ', ' + teamid + ', ' + seasonid);
return {
siteId: siteid,
teamId: teamid,
seasonId: seasonid
}
},
logChange: function(newValue, oldValue) {
console.log('Param changed to: ', newValue);
},
handleRequestSent: function (request) {
console.log('ReqSent');
//console.log(request);
},
handleResponseReceived: function (response) {
console.log('ResReceived');
//console.log(response);
//console.log("Received response: " + JSON.stringify(response.detail.response));
//this.result = response.detail.response;
},
handleError: function (event) {
console.log('error');
//var request = event.detail.request;
//var error = event.detail.error;
//console.log(request);
//console.log(error);
}
});
</script>
</polymer-element>
以下函数返回Polymer::Attributes:无法将数组解码为JSON消息,我为每个语句添加了控制台日志,并注释掉了在try/catch 获取数组类型 JSON.parse 了解更多详细信息。
起初我以为这个过程是双重 JSON 解码,所以我将 ajax dataType 设置为“text”,并尝试使用 JSON.parse 手动解析数据,数据解析成功。
deserialize: function (value, type) {
switch (type) {
case Number:
console.log('Number: ' + value);
value = Number(value);
break;
case Boolean:
console.log('Boolean: ' + value);
value = value != null;
break;
case Object:
console.log('Object: ' + value);
try {
value = JSON.parse(value);
} catch (x) {
}
break;
case Array:
console.log('Array: ' + value);
try {
value = JSON.parse(value);
} catch (x) {
//value = null;
console.warn('Polymer::Attributes: couldn`t decode Array as JSON');
}
break;
case Date:
console.log('Date: ' + value);
value = new Date(value);
break;
case String:
console.log('String: ' + value);
default:
break;
}
return value;
}
JSON returned from web service
感觉好像 Polymer 正在将 {{matches}} 作为字符串而不是实际数据,如果有人能够阐明这项相对较新的技术,我将非常感激 - 谢谢。
最佳答案
嗨,我找到了答案,第一行以聚合物元素标签开头,该标签用于旧版本的聚合物,新版本使用 dom-module。
还添加了观察者,以确保在通过 ajax 获取数据之前设置所有变量。
这是一个工作版本:
<dom-module id="fixtures-list">
<template>
<row>
<div class="col-lg-6 col-md-6 col-sm-6 col-xs-12">
<select id="fixtures-list-season-selector" class="selectpicker"></select>
</div>
<div class="col-lg-6 col-md-6 col-sm-6 col-xs-12 text-right">
<span class="label label-info">home match</span>
</div>
</row>
<table class="table table-responsive">
<thead>
<tr>
<th>Date</th>
<th class="text-center">
<span class="hidden-xs"><abbr title="Kick Off">KO</abbr>/Result</span>
<span class="visible-xs"><abbr title="Kick Off">KO</abbr>/<abbr title="Result">Res</abbr></span>
</th>
<th></th>
<th>Opponent</th>
<th class="hidden-xs">Venue</th>
<th class="hidden-xs" class="text-center"><abbr title="Competition">Comp</abbr></th>
<th class="hidden-xs" class="text-center"><abbr title="Televised">TV</abbr>/<abbr title="Attendance">ATT</abbr></th>
<th></th>
</tr>
</thead>
<tbody>
<template is="dom-repeat" items="{{fixturesData}}" as="fixture">
<tr class$="{{highlightRow(fixture.IsHome)}}">
<td>
<span class="hidden-xs">{{displayDate(fixture.KickOff)}}</span>
<span class="visible-xs">{{displayShortDate(fixture.KickOff)}}</span>
</td>
<td class="text-center">
<template is="dom-if" if="{{fixture.IsResult}}">
{{fixture.Score}}
</template>
<template is="dom-if" if="{{!fixture.IsResult}}">
{{displayTime(fixture.KickOff)}}
</template>
</td>
<td>
<template is="dom-if" if="{{fixture.IsResult}}">
{{fixture.Result}}
</template>
</td>
<td>{{fixture.OpponentNameShort}}</td>
<td class="hidden-xs">{{fixture.Venue}}</td>
<td class="text-center hidden-xs">{{fixture.EventAbbreviations}}</td>
<td class="text-center hidden-xs">
<template is="dom-if" if="{{fixture.IsResult}}">
{{fixture.Attendance}}
</template>
<template is="dom-if" if="{{!fixture.IsResult}}">
{{fixture.BroadcasterAbbreviations}}
</template>
</td>
<td class="text-center">
<template is="dom-if" if="{{fixture.IsResult}}">
<a href="/MatchReport/{{fixture.Id}}/" class="btn btn-default">view</a>
</template>
<template is="dom-if" if="{{!fixture.IsResult}}">
<a href="/MatchPreview/{{fixture.Id}}/" class="btn btn-default">view</a>
</template>
</td>
</tr>
</template>
</tbody>
</table>
</template>
<script>
Polymer({
is: 'fixtures-list',
properties: {
siteid: {
type: Number,
value: -1,
notify: true,
reflectToAttribute: true,
observer: 'logChange'
},
teamid: {
type: Number,
value: -1,
notify: true,
reflectToAttribute: true,
observer: 'logChange'
},
dateformatstring: {
type: String,
value: '',
notify: true,
reflectToAttribute: true,
observer: 'logChange'
},
timeformatstring: {
type: String,
value: '',
notify: true,
reflectToAttribute: true,
observer: 'logChange'
},
seasonstarted: {
type: String,
value: '',
notify: true,
reflectToAttribute: true,
observer: 'logChange'
},
ajaxParams: {
type: Object,
computed: 'processParams(siteid, teamid, seasonid)'
},
fixturesData: {
type: Array,
value: function () { return []; }
}
},
isAttributeValuesReady: false,
observers: [
// Note that this function will not fire until *all* parameters given have been set to something other than `undefined`
'attributesReady(siteid, teamid, dateformatstring, timeformatstring)'
],
attributesReady: function (siteid, teamid, dateformatstring, timeformatstring) {
this.isAttributeValuesReady = true;
console.log('attributesReady: ' + siteid + ', ' + teamid + ', ' + dateformatstring + ', ' + timeformatstring);
//this.$.matchesService.set('params.siteId', siteid);
//this.$.matchesService.set('params.teamId', teamid);
//this.$.matchesService.set('params.dateFormatString', dateFormatString);
//this.$.matchesService.set('params.timeFormatString', timeFormatString);
//this.$.matchesService.generateRequest();
},
loadMatchesList: function () {
var self = this;
$.ajax({
url: 'http://localhost:20440/MatchesService.svc/matches/GetAllForTeamInSeason',
data: {
siteId: this.siteid,
teamId: this.teamid,
seasonId: $('#fixtures-list-season-selector').val()
},
error: function () {
console.log('ajax error');
},
dataType: 'json',
success: function (data) {
console.log('fixtures-list: matches data received');
self.fixturesData = data;
},
type: 'GET'
});
},
ready: function () {
//console.log('polymer element ready');
var self = this;
if (self.isAttributeValuesReady) {
$.ajax({
url: 'http://localhost:20440/SeasonsService.svc/seasons/GetAll',
data: {
siteId: this.siteid,
teamId: this.teamid
},
error: function () {
//console.log('ajax error');
},
dataType: 'json',
success: function (data) {
//console.log('fixtures-list: season data received');
//console.log(data);
var defaultId = 0;
for (var i = 0; i < data.length; i++) {
if (i == 0) {
defaultId = data[i].Id;
}
if (i < 100) {
$('#fixtures-list-season-selector').append('<option value="' + data[i].Id + '">' + data[i].Name + '</option>');
}
if (self.seasonstarted.length > 0 && self.seasonstarted == data[i].Name) {
break;
}
}
setTimeout(function () {
console.log('init select');
$('#fixtures-list-season-selector').selectpicker('val', defaultId).on('changed.bs.select', function (e) {
self.loadMatchesList();
});
}, 500);
self.loadMatchesList();
},
type: 'GET'
});
}
},
displayDate: function (jsonDate) {
var jsDate = new Date(jsonDate.match(/\d+/)[0] * 1);
var tmpDateFormatString = this.dateformatstring;
if (tmpDateFormatString.length <= 0 || (tmpDateFormatString.length > 0 && tmpDateFormatString == 'NaN')) {
tmpDateFormatString = "ddd, d mmm";
}
return dateFormat(jsDate, tmpDateFormatString);
},
displayShortDate: function (jsonDate) {
var jsDate = new Date(jsonDate.match(/\d+/)[0] * 1);
var tmpDateFormatString = this.dateformatstring;
return dateFormat(jsDate, "d mmm");
},
displayTime: function (jsonDate) {
var jsDate = new Date(jsonDate.match(/\d+/)[0] * 1);
var tmpTimeFormatString = this.timeformatstring;
if (tmpTimeFormatString.length <= 0 || (tmpTimeFormatString.length > 0 && tmpTimeFormatString == 'NaN')) {
tmpTimeFormatString = "HH:MM";
}
return dateFormat(jsDate, tmpTimeFormatString);
},
highlightRow: function(isHome) {
var css = '';
if (isHome) {
css = 'info';
}
return css;
},
processParams: function (siteid, teamid) {
//return 'siteId='+ siteid + '&teamId=' + teamid + '&seasonId=' + $('#fixtures-list-season-selector').val();
return JSON.stringify({
siteId: siteid,
teamId: teamid,
seasonId: $('#fixtures-list-season-selector').val()
});
},
logChange: function (newValue, oldValue) {
console.log('Param changed to: ', newValue);
},
handleRequestSent: function (request) {
console.log('ReqSent');
//console.log(request);
},
handleResponseReceived: function (response) {
console.log('ResReceived');
//console.log(response);
//console.log("Received response: " + JSON.stringify(response.detail.response));
//this.result = response.detail.response;
},
handleError: function (event) {
console.log('error');
//var request = event.detail.request;
//var error = event.detail.error;
//console.log(request);
//console.log(error);
}
});
</script>
关于javascript - Polymer v1.3.1 databind 无法使用或不使用带有重复模板和 json 数组的 iron-ajax,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36174761/
我想使用 li 和 ul 制作一个多级下拉列表,以便显示我博客中按年和月排序的所有文章。我希望我的下拉菜单看起来像 Google Blogspot 下拉菜单: 这是我的 CSS 和 HTML 代码 u
我在 Win 7 64 机器上将 CodeBlocks 与 gcc 4.7.2 和 gmp 5.0.5 结合使用。开始使用 gmpxx 后,我看到一个奇怪的段错误,它不会出现在 +、- 等运算符中,但
我正在使用 tern 为使用 CodeMirror 运行的窗口提供一些增强的智能感知,它工作正常,但我遇到了一个问题,我想添加一些自定义“types”,可以这么说,这样下拉列表中它们旁边就有图标了。我
我正在尝试让我的 PC 成为 Android 2.3.4 设备的 USB 主机,以便能够在不需要实际“附件”的情况下开发 API。为此,我需要将 PC 设置为 USB 主机和“设备”(在我的例子中是运
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 9
我在设置服务器方面几乎是个新手,但遇到了一个问题。我有一个 Ubuntu 16.04 VPS 并安装了 Apache2 和 Tomcat7。我正在为 SSL 使用 LetsEncrypt 和 Cert
我在一个基于谷歌地图的项目上工作了超过 6 个月。我使用的是 Google Maps API V1 及其开发人员 API key 。当我尝试发布应用程序时,我了解到 Google API V1 已被弃
我是 Python 的新手,所以如果我对一些简单的事情感到困惑,请原谅。 我有一个这样的对象: class myObject(object): def __init__(self):
这个问题已经有答案了: How can I access object properties containing special characters? (2 个回答) 已关闭 9 年前。 我正在尝
我有下面的 CSS。我想要的是一种流体/液体(因为缺乏正确的术语)css。我正在为移动设备开发,当我改变模式时 从纵向 View 到陆地 View ,我希望它流畅。现在的图像 在陆地 View 中效
我正在尝试使用可以接受参数的缓存属性装饰器。 我查看了这个实现:http://www.daniweb.com/software-development/python/code/217241/a-cac
这个问题在这里已经有了答案: Understanding slicing (36 个答案) 关闭 6 年前。 以a = [1,2,3,4,5]为例。根据我的直觉,我认为 a[::-1] 与 a[0:
mysqldump -t -u root -p mytestdb mytable --where=datetime LIKE '2014-09%' 这就是我正在做的事情,它会返回: mysqldum
我正在制作销售税计算器,除了总支付金额部分外,其他一切都正常。在我的程序中,我希望能够输入一个数字并获得该项目的税额我还希望能够获得支付的总金额,包括交易中的税金。到目前为止,我编写的代码完成了所有这
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许在 Stack Overflow 上提出有关通用计算硬件和软件的问题。您可以编辑问题,使其成为
我是否必须进行任何额外的设置才能让 apache-airflow 在任务失败时向我发送电子邮件。我的配置文件中有以下内容(与默认值保持不变): [email] email_backend = airf
这个问题在这里已经有了答案: What does the $ symbol do in VBA? (5 个回答) 3年前关闭。 使用返回字符串(如 Left)的内置函数有什么区别吗?或使用与 $ 相同
我有一个用VB6编写的应用程序,我需要使用一个用.NET编写的库。有什么方法可以在我的应用程序上使用该库吗? 谢谢 最佳答案 这取决于。您可以控制.NET库吗? 如果是这样,则可以修改您的库,以便可以
当我创建一个以 ^ 开头的类方法时,我尝试调用它,它给了我一个错误。 class C { method ^test () { "Hi" } } dd C.new.test; Too m
我已经使用 bower 安装了 angularjs 和 materialjs。 凉亭安装 Angular Material 并将“ngMaterial”注入(inject)我的应用程序,但出现此错误。
我是一名优秀的程序员,十分优秀!