聚合物如何将纸张输入值绑定到铁-ajax

时间:2015-06-25 19:54:58

标签: javascript css polymer

以下是我的网页代码

<!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',另一个参数是输入到paperInput中的任何一个名为searchCriteria的内容。

麻烦的是没有获得两个参数Command和Criteria。我得到一个空的QueryString,它看起来不像buildSearchRequest。

那么如何才能得到它,以便如果我在纸张输入中输入“abba”,则查询字符串应为

Command=search&criteria=abba

2 个答案:

答案 0 :(得分:8)

我在下面放了一个简化的代码工作版本。以下是一些注意事项:

  1. 此声明

    ajaxParams: {
      type: String,
      computed: 'buildSearchRequest();'
    },
    

    是属性定义,必须进入properties对象。

  2. 回调值,例如

    computed: 'buildSearchRequest();'
    

    看起来像函数但它们不是实际代码,也不需要尾随;

  3. 您的计算函数需要有一个参数来告诉它何时重新计算。我修改它看起来像这样:

    computed: 'buildSearchRequest(searchCriteria)'
    

    我将searchCriteria绑定到输入value

  4. Polymer代码中的事件处理程序使用on-表示法,所以

    onkeypress="handleKeyPress(event);"
    

    应该是

    on-keypress="handleKeyPress"
    
  5. iron-ajax错误通知是通过名为error的事件,所以

    handleerror="handleError"
    

    应该是

    on-error="handleError"
    
  6. 我添加了stringify位和参数的输出,这样您就可以在键入时看到它的计算,这对您的用例来说不是必需的。

  7. HTML中只有极少数元素 void (无需关闭标记)。你应该避免做<tag-name/>,因为它最终会造成麻烦。

  8. 直播: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

答案 1 :(得分:0)

我得到了它的工作。不确定这是否是正式的最佳方式,但是通过将searchPractice函数的代码更改为以下内容 - 发送了正确的QueryString并且搜索有效。

            searchPractice: function () {
                try {
                    this.$.GPSearch.params = {
                        Command: 'Search',
                        Criteria: this.$.searchCriteria.value
                    };
                    this.$.GPSearch.generateRequest();
                }
                catch (e) {
                    alert("Whoops! " + e.message);
                }

            }