Polymer如何绑定paper-input值到iron-ajax
Polymer how to bind paper-input value to iron-ajax
以下是我的页面代码
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>GP and Practice search</title> <!-- Scripts -->
<script src="bower_components/webcomponentsjs/webcomponents-lite.js"></script>
<link rel="import" href="elements/elements.html" />
<link rel="stylesheet" type="text/css" href="Styles/styles.css" />
<link rel="stylesheet" type="text/css" href="Styles/home.css"/>
<!-- google fonts definitions -->
<link href='http://fonts.googleapis.com/css?family=Roboto:400,700' rel='stylesheet' type='text/css'>
</head>
<body unresolved class="fullbleed layout vertical">
<dom-module id="page-scafolding">
<template>
<paper-drawer-panel elevation="1">
<paper-header-panel main mode="waterfall-tall">
<paper-toolbar id="mainToolbar">
<paper-icon-button id="paperToggle" icon="menu" paper-drawer-toggle></paper-icon-button>
<span class="flex"></span>
<paper-icon-button icon="search" on-tap="srchandler" id="srchandler"></paper-icon-button>
<input type="text" id="searchText" hidden$="{{hideSearch}}" onkeypress="handleKeyPress(event);" />
<div class="middle paper-font-display2 app-name ident">Search</div>
</paper-toolbar>
<paper-material elevation="1" class="contentContainer" >
<div id="Content" >
<span>
<paper-input id="searchCriteria"
class="searchBox"
label="Code or name of the GP or Practice you are looking for?" />
</span>
<div style="text-align:center; padding:10px;">
<paper-button tabindex="0" raised="true" class="colorful" on-click="searchPractice">Search for Practice</paper-button>
<paper-button tabindex="0" raised="true" class="colorful" on-click="searchPractice">Search for GP</paper-button>
</div>
<div id="SearchResult">
<template is="dom-repeat" items="{{data}}">
<p><span>{{item.Name}}</span> (<span>{{item.PracticeCode}}</span>)</p>
</template>
</div>
</div>
</paper-material>
<iron-ajax id="GPSearch"
url="/GPPractices.ashx"
handle-as="json"
last-response="{{data}}"
params='{{ajaxParams}}'
handleerror="handleError">
</iron-ajax>
</paper-header-panel>
</paper-drawer-panel>
</template>
<script>
Polymer({
is: "page-scafolding",
ready: function () {
this.hideSearch = true;
this.$.searchText.keyup(function (e) {
alert('off to search for something!');
});
},
ajaxParams: {
type: String,
computed: 'buildSearchRequest();'
},
buildSearchRequest: function () {
return {
Command: 'Search',
Criteria: this.$.searchCriteria
}
},
srchandler: function () {
// search for contents of search box is showing, otherwise show it.
if (!this.hideSearch)
{
alert('off to search for something!');
}
else {
this.hideSearch = !this.hideSearch;
if (!this.hideSearch) {
this.$.searchText.focus();
}
}
},
searchPractice: function () {
try {
this.$.GPSearch.generateRequest();
}
catch (e) {
alert("Whoops! " + e.message);
}
},
handleError: function (request, error) {
alert('Whoops! ' + error);
}
});
</script>
</dom-module>
<page-scafolding />
</body>
</html>
我收到了 ajax 呼叫,并且正在呼叫 GPPractices.ashx。我要做的是将两个参数传递给此页面。一个是 Command,其值为 'search',另一个参数是输入到名为 searchCriteria 的 paperInput 中的任何内容。
问题是没有得到两个参数Command 和Criteria。我得到一个空的 QueryString,它看起来不像是曾经调用过 buildSearchRequest。
那么我怎样才能得到它,如果我在纸输入中输入 say 'abba',查询字符串应该是
Command=search&criteria=abba
我让它工作了。不确定这是否是正式的最佳方式,但通过将 searchPractice 函数的代码更改为以下 - 发送正确的 QueryString 并且搜索有效。
searchPractice: function () {
try {
this.$.GPSearch.params = {
Command: 'Search',
Criteria: this.$.searchCriteria.value
};
this.$.GPSearch.generateRequest();
}
catch (e) {
alert("Whoops! " + e.message);
}
}
我在下面放置了您代码的简化工作版本。以下是一些注意事项:
这个声明
ajaxParams: {
type: String,
computed: 'buildSearchRequest();'
},
是一个 属性 定义,必须进入 properties
对象。
回调值如
computed: 'buildSearchRequest();'
看起来像函数,但它们不是实际代码,不需要尾随 ;
您的 computed 函数需要有一个参数来告诉它何时重新计算。我将其修改为如下所示:
computed: 'buildSearchRequest(searchCriteria)'
并且我将 searchCriteria
绑定到输入 value
。
Polymer 代码中的事件处理程序使用 on-
表示法,因此
onkeypress="handleKeyPress(event);"
应该是
on-keypress="handleKeyPress"
iron-ajax 错误通知是通过名为 error
的事件发出的,所以
handleerror="handleError"
应该是
on-error="handleError"
我添加了 stringify
位和参数的输出,这样您就可以看到它在您键入时进行计算,这对于您的用例来说不是必需的。
只有极少数元素在 HTML 中是 void(不需要结束标记)。你应该避免做 <tag-name/>
因为它最终会引起麻烦。
直播:http://jsbin.com/sorowi/edit?html,output
<dom-module id="page-scafolding">
<template>
<paper-input
label="Code or name of the GP or Practice you are looking for?"
value="{{searchCriteria}}">
</paper-input>
<br>
<div style="text-align:center; padding:10px;">
<paper-button tabindex="0" raised="true" style="background-color: lightblue;" on-click="searchPractice">Search for Practice</paper-button>
</div>
<iron-ajax id="GPSearch"
url="/GPPractices.ashx"
handle-as="json"
last-response="{{data}}"
params="{{ajaxParams}}"
on-error="handleError">
</iron-ajax>
<br><br>
ajaxParams: <span>{{stringify(ajaxParams)}}</span>
<div id="SearchResult">
<template is="dom-repeat" items="{{data}}">
<p><span>{{item.Name}}</span> (<span>{{item.PracticeCode}}</span>)</p>
</template>
</div>
</template>
<script>
Polymer({
is: "page-scafolding",
properties: {
ajaxParams: {
type: String,
computed: 'buildSearchRequest(searchCriteria)'
}
},
stringify: JSON.stringify,
buildSearchRequest: function (criteria) {
return {
Command: 'Search',
Criteria: criteria
};
},
searchPractice: function () {
this.$.GPSearch.generateRequest();
},
handleError: function(e) {
alert('Whoops! ' + e.detail);
}
});
</script>
</dom-module>
HTH
以下是我的页面代码
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>GP and Practice search</title> <!-- Scripts -->
<script src="bower_components/webcomponentsjs/webcomponents-lite.js"></script>
<link rel="import" href="elements/elements.html" />
<link rel="stylesheet" type="text/css" href="Styles/styles.css" />
<link rel="stylesheet" type="text/css" href="Styles/home.css"/>
<!-- google fonts definitions -->
<link href='http://fonts.googleapis.com/css?family=Roboto:400,700' rel='stylesheet' type='text/css'>
</head>
<body unresolved class="fullbleed layout vertical">
<dom-module id="page-scafolding">
<template>
<paper-drawer-panel elevation="1">
<paper-header-panel main mode="waterfall-tall">
<paper-toolbar id="mainToolbar">
<paper-icon-button id="paperToggle" icon="menu" paper-drawer-toggle></paper-icon-button>
<span class="flex"></span>
<paper-icon-button icon="search" on-tap="srchandler" id="srchandler"></paper-icon-button>
<input type="text" id="searchText" hidden$="{{hideSearch}}" onkeypress="handleKeyPress(event);" />
<div class="middle paper-font-display2 app-name ident">Search</div>
</paper-toolbar>
<paper-material elevation="1" class="contentContainer" >
<div id="Content" >
<span>
<paper-input id="searchCriteria"
class="searchBox"
label="Code or name of the GP or Practice you are looking for?" />
</span>
<div style="text-align:center; padding:10px;">
<paper-button tabindex="0" raised="true" class="colorful" on-click="searchPractice">Search for Practice</paper-button>
<paper-button tabindex="0" raised="true" class="colorful" on-click="searchPractice">Search for GP</paper-button>
</div>
<div id="SearchResult">
<template is="dom-repeat" items="{{data}}">
<p><span>{{item.Name}}</span> (<span>{{item.PracticeCode}}</span>)</p>
</template>
</div>
</div>
</paper-material>
<iron-ajax id="GPSearch"
url="/GPPractices.ashx"
handle-as="json"
last-response="{{data}}"
params='{{ajaxParams}}'
handleerror="handleError">
</iron-ajax>
</paper-header-panel>
</paper-drawer-panel>
</template>
<script>
Polymer({
is: "page-scafolding",
ready: function () {
this.hideSearch = true;
this.$.searchText.keyup(function (e) {
alert('off to search for something!');
});
},
ajaxParams: {
type: String,
computed: 'buildSearchRequest();'
},
buildSearchRequest: function () {
return {
Command: 'Search',
Criteria: this.$.searchCriteria
}
},
srchandler: function () {
// search for contents of search box is showing, otherwise show it.
if (!this.hideSearch)
{
alert('off to search for something!');
}
else {
this.hideSearch = !this.hideSearch;
if (!this.hideSearch) {
this.$.searchText.focus();
}
}
},
searchPractice: function () {
try {
this.$.GPSearch.generateRequest();
}
catch (e) {
alert("Whoops! " + e.message);
}
},
handleError: function (request, error) {
alert('Whoops! ' + error);
}
});
</script>
</dom-module>
<page-scafolding />
</body>
</html>
我收到了 ajax 呼叫,并且正在呼叫 GPPractices.ashx。我要做的是将两个参数传递给此页面。一个是 Command,其值为 'search',另一个参数是输入到名为 searchCriteria 的 paperInput 中的任何内容。
问题是没有得到两个参数Command 和Criteria。我得到一个空的 QueryString,它看起来不像是曾经调用过 buildSearchRequest。
那么我怎样才能得到它,如果我在纸输入中输入 say 'abba',查询字符串应该是
Command=search&criteria=abba
我让它工作了。不确定这是否是正式的最佳方式,但通过将 searchPractice 函数的代码更改为以下 - 发送正确的 QueryString 并且搜索有效。
searchPractice: function () {
try {
this.$.GPSearch.params = {
Command: 'Search',
Criteria: this.$.searchCriteria.value
};
this.$.GPSearch.generateRequest();
}
catch (e) {
alert("Whoops! " + e.message);
}
}
我在下面放置了您代码的简化工作版本。以下是一些注意事项:
这个声明
ajaxParams: { type: String, computed: 'buildSearchRequest();' },
是一个 属性 定义,必须进入
properties
对象。回调值如
computed: 'buildSearchRequest();'
看起来像函数,但它们不是实际代码,不需要尾随
;
您的 computed 函数需要有一个参数来告诉它何时重新计算。我将其修改为如下所示:
computed: 'buildSearchRequest(searchCriteria)'
并且我将
searchCriteria
绑定到输入value
。Polymer 代码中的事件处理程序使用
on-
表示法,因此onkeypress="handleKeyPress(event);"
应该是
on-keypress="handleKeyPress"
iron-ajax 错误通知是通过名为
error
的事件发出的,所以handleerror="handleError"
应该是
on-error="handleError"
我添加了
stringify
位和参数的输出,这样您就可以看到它在您键入时进行计算,这对于您的用例来说不是必需的。只有极少数元素在 HTML 中是 void(不需要结束标记)。你应该避免做
<tag-name/>
因为它最终会引起麻烦。
直播:http://jsbin.com/sorowi/edit?html,output
<dom-module id="page-scafolding">
<template>
<paper-input
label="Code or name of the GP or Practice you are looking for?"
value="{{searchCriteria}}">
</paper-input>
<br>
<div style="text-align:center; padding:10px;">
<paper-button tabindex="0" raised="true" style="background-color: lightblue;" on-click="searchPractice">Search for Practice</paper-button>
</div>
<iron-ajax id="GPSearch"
url="/GPPractices.ashx"
handle-as="json"
last-response="{{data}}"
params="{{ajaxParams}}"
on-error="handleError">
</iron-ajax>
<br><br>
ajaxParams: <span>{{stringify(ajaxParams)}}</span>
<div id="SearchResult">
<template is="dom-repeat" items="{{data}}">
<p><span>{{item.Name}}</span> (<span>{{item.PracticeCode}}</span>)</p>
</template>
</div>
</template>
<script>
Polymer({
is: "page-scafolding",
properties: {
ajaxParams: {
type: String,
computed: 'buildSearchRequest(searchCriteria)'
}
},
stringify: JSON.stringify,
buildSearchRequest: function (criteria) {
return {
Command: 'Search',
Criteria: criteria
};
},
searchPractice: function () {
this.$.GPSearch.generateRequest();
},
handleError: function(e) {
alert('Whoops! ' + e.detail);
}
});
</script>
</dom-module>
HTH