我有一个聚合物元素,我想将一个标记作为标题属性。
当我按下按钮时,会发送XMLHttpReqeust。负责的iron-ajax
元素具有带有字符串的headers
属性。我想更改字符串,并应用不同的属性。
我被告知正常compound bindings
不起作用,我应该尝试computed bindings
或computed properties
。
但问题似乎是问题,如何bind
这些computed properties
或computed bindings
iron-ajax
元素?
每当我使用花括号时,都不会评估任何内容。如果我把它们留下来,只会解析剩下的字符串。
这是我的元素:
<link rel="import" href="../bower_components/polymer/polymer.html">
<link rel="import" href="../bower_components/iron-ajax/iron-ajax.html">
<dom-module id="demo-element">
<template>
<button on-click="sendXMLHttpRequest">sendXMLHttpRequest</button>
<div>
Computed Binding HeadersProperty:
<span>{{computeHeadersProperty(csrfToken)}}</span>
</div>
<div>
Computed Property HeadersProperty:
<span>{{headersProperty}}</span>
</div>
<div>
Computed Binding HeadersToken:
<span>{{computeHeadersToken(csrfToken)}}</span>
</div>
<div>
Computed Property HeadersToken:
<span>{{headersToken}}</span>
</div>
<iron-ajax
id="ajax"
method="POST"
url=""
handle-as="json"
headers='{"X-CSRF-Token": "csrfToken"}'
></iron-ajax>
</template>
<script>
Polymer({
is: 'demo-element',
properties: {
csrfToken: {
type: String,
value: 'aBcDeF'
},
headersProperty: {
type: String,
computed: 'computeHeadersProperty(csrfToken)'
},
headersToken: {
type: String,
computed: 'computeHeadersToken(csrfToken)'
}
},
sendXMLHttpRequest: function () {
// ajax call
this.$.ajax.body = this.headersProperty;
this.$.ajax.generateRequest();
},
computeHeadersProperty: function (csrfToken) {
return '{"X-CSRF-Token":\"' + csrfToken + '\"}';
},
computeHeadersToken: function (csrfToken) {
return csrfToken;
}
});
</script>
</dom-module>
正如您所看到的,我已经为完整的headers
属性创建了计算绑定和属性,并且还为我想要传递的令牌创建了。
但是当我使用大括号时,铁-ajax元素不会评估任何东西。
以下是我到目前为止在iron-ajax
元素中尝试过的内容:
{"X-CSRF-Token": "headersToken"}
那么,我如何将属性绑定到headers
元素的iron-ajax
属性?
有些用户提供了“工作解决方案”,但遗憾的是无法正常工作,因为似乎设置了headers
,但headers request
中未包含x-csrf-token
。证明:
将此与我们使用随机字符串的情况进行比较:
此处iron-ajax
已正确设置。
因为无法在提供的JSBIN中检查请求,所以我在此处包含了一个git存储库,其中包含示例代码:https://github.com/LoveAndHappiness/polymer-iron-ajax-issue-159
我必须包含依赖项而不是多字母资源,因为在使用iron-ajax
时,polygit会抛出错误。
headers='{{computeHeadersProperty(csrfToken)}}'
元素中更改第50行上的headers属性 headers='{"X-CSRF-Token":"ARandomString"}'
到
headings
根据控制台的输出判断,错误似乎是iron-ajax
元素中的Object
属性需要string
,但数据绑定的评估返回{ {1}}。
我希望有人至少可以重现错误。
答案 0 :(得分:5)
headersProperty
希望成为Object
,而不是String
。
工作示例:http://jsbin.com/rasoqexese/edit?html,output
非常感谢Peter Burns
答案 1 :(得分:1)
关于这一主题的最后一次行动大约是半年前的事。我尝试了同样的事情:在iron-ajax请求的标题中添加一个标记。我尝试了原始海报尝试的所有内容,并尝试了答案中显示的所有内容。我在网上搜索了大约三个星期,有时每天晚上几个小时。我找不到解决方案。没有任何效果。属性不会评估和/或它们不会添加到请求的标头中。
我的回答:看起来不可能将计算属性添加到iron-ajax请求的标题 。请记住, Polymer是一个非常新的框架,在下一个版本中需要改进很多东西。
答案 2 :(得分:1)
您可能正在寻找attribute binding。这对你有用:
<iron-ajax
id="ajax"
method="POST"
url=""
handle-as="json"
headers$='{"X-CSRF-Token": "{{csrfToken}}"}'
></iron-ajax>
答案 3 :(得分:0)
我认为您需要将notify:true
放在csrfToken
属性上。
答案 4 :(得分:0)
这至少是一个有效的JSBIN版本:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Polymer Bin</title>
<base href="http://polygit.org/polymer+:master/components/">
<!-- Third-party imports -->
<script src="webcomponentsjs/webcomponents-lite.min.js"></script>
<link href="iron-ajax/iron-ajax.html" rel="import">
<!-- Styling -->
<style>
</style>
<dom-module id="demo-element">
<template>
<button on-click="sendXMLHttpRequest">sendXMLHttpRequest</button>
<iron-ajax
id="ajax"
method="POST"
url=""
handle-as="json"
headers="{{computeHeadersProperty(csrfToken)}}"
>
</iron-ajax>
</template>
</dom-module>
<script>
Polymer({
is: 'demo-element',
properties: {
csrfToken: {
type: String,
value: 'aBcDeF'
},
headersProperty: {
type: String,
computed: 'computeHeadersProperty(csrfToken)'
},
headersToken: {
type: String,
computed: 'computeHeadersToken(csrfToken)'
}
},
sendXMLHttpRequest: function () {
// ajax call
console.log("Headers in AJAX: " + this.$.ajax.headers);
//this.$.ajax.body = this.headersProperty;
//this.$.ajax.generateRequest();
},
computeHeadersProperty: function (csrfToken) {
return {"X-CSRF-Token": ' + csrfToken };
}
});
</script>
</head>
<body unresolved class="fullbleed layout vertical">
<demo-element></demo-element>
</body>
</html>