【问题标题】:Remove child element's attribute from Polymer js从 Polymer js 中删除子元素的属性
【发布时间】:2015-02-23 13:11:48
【问题描述】:

我有一个自定义元素,其中有一个核心输入和一个纸质按钮。 创建元素时,输入被禁用,我想在点击按钮时启用它。 试了好几种方法,都无法访问输入的属性。

<paper-input-decorator label="Nombre de usuario" floatingLabel>
      <input id="usernameinput" value="{{UserName}}" is="core-input" disabled />
</paper-input-decorator>
<paper-button raised id="edprobutton" on-tap="{{edbutTapped}}">EDITAR</paper-button>

我应该写什么

edbutTapped: function () {

        },

编辑

所以,我了解到问题在于我的用户名输入元素位于重复模板中,这对我试图做的事情不利。现在我正在尝试将单个 json 对象绑定到我的元素,但到目前为止没有运气。

我现在拥有的:

在我的索引页面中:

<profile-page id="profpage" isProfile="true" entity="{{profEntity}}"></profile-page>

<script>
    $(document).ready(function () {
        var maintemplate = document.querySelector('#fulltemplate');

        $.getJSON('api/userProfile.json', function (data) {
            var jsonString = JSON.stringify(data);
            alert(jsonString);
            maintemplate.profEntity = jsonString;
        });
    }
</script>

在我的元素页面中:

<polymer-element name="profile-page" attributes="isprofile entity">
    <template>
        <style>
            [...]
        </style>
        <div flex vertical layout>
            <core-label class="namepro">{{entity.Name}}</core-label>
            <core-label class="subpro">{{entity.CompanyPosition}}</core-label>
            <core-label class="subpro">{{entity.OrgUnitName}}</core-label>
        </div>
    </template>
</polymer-element>

我的 JSON 看起来像这样:

{"Name": "Sara Alvarez","CompanyPosition": "Desarrollo","OrgUnitName": "N-Adviser"}

我假设我需要在更改其实体属性后以某种方式“更新”我的元素?

【问题讨论】:

    标签: polymer custom-element


    【解决方案1】:

    试试下面的

    <script>
        Polymer({
             edbutTapped: function () {
                  this.$.usernameinput.disabled = false;
             }
        });
    </script>
    

    this.$ 允许您访问元素中定义的控件,并且 usernameinput 是您分配给输入的 id。

    这可以位于您定义的元素的结束标记下方。

    【讨论】:

    • 我已经试过了,报错显示“unable to get property 'disabled' of undefined or null reference”
    • 我在答案中添加了更多细节 - 试试看。如果不处理它,可能需要查看更多代码。听起来在调用处理程序时未定义用户名输入。
    • 抱歉,我现在意识到它在重复模板中。但它不应该,因为它只有一个对象,而是来自一个 json 文件,我不知道如何只绑定一个对象,而不是使用重复。
    • 我可以在创建的元素上创建一个用户对象,但是我如何从 JSON 中提取它,并且 - 比这更重要 - 如果绑定不是重复的模板,或者它需要在模板之外工作?
    • 您将其放入重复模板中是否有原因?如果您只想要一份副本,请将其放在重复之外。否则,您的问题与我刚刚发布的问题相同,我正在尝试为重复模板中的对象创建事件处理程序 - 尽管在我的情况下有“n”个条目,其中 n 是数据库中的记录数。
    【解决方案2】:

    '禁用'是conditional-attribute

    所以这将是它的正确用法:

    <input id="usernameinput" value="{{UserName}}" is="core-input" disabled?="{{isDisabled}}" />
    

    在原型中:

    //first disable the field, can be done in ready callback:
    ready: function () {
               this.isDisabled = 'true';
     }
    
    //set idDisabled to 'false' i.e. enable the input
    edbutTapped: function () {            
               this.isDisabled = 'false';
            },
    

    【讨论】:

    • 也试过了,没用,但我认为问题在于它在重复模板中,正如我在上面的 cmets 上写的那样
    【解决方案3】:

    好的,这将是一个很长的答案(因此我没有输入这个作为我原始答案的编辑)。我刚刚做了一些功能相同的东西。

    首先是这段代码;

        $.getJSON('api/userProfile.json', function (data) {
            var jsonString = JSON.stringify(data);
            alert(jsonString);
            maintemplate.profEntity = jsonString;
        });
    

    Polymer 有一个名为 core-ajax 的控件——顾名思义,它会进行 ajax 调用。另一个非常好的事情是它可以在 URL 更改时执行。这是我的项目中的代码。

        <core-ajax id="ajax"
                   auto=true
                   method="POST"
                   url="/RoutingMapHandler.php?Command=retrieve&Id=all"
                   response="{{response}}"
                   handleas="json"
                   on-core-error="{{handleError}}" 
                   on-core-response="{{handleResponse}}">
        </core-ajax>
    

    auto 是告诉它在 URL 更改时触发的位。聚合物文档中对 auto 的描述如下;

    将 auto 设置为 true 时,该元素会在任何时候执行请求 url、params 或 body 属性已更改。

    您不需要 on-core-response 但 on-core-error 可能更有用。因为我的代码响应包含返回的 JSON。

    所以对于您的代码 - 它会是这样的

        <core-ajax id="ajax"
                   auto=true
                   method="POST"
                   url="/api/userProfile.json"
                   response="{{jsonString}}"
                   handleas="json"
                   on-core-error="{{handleError}}" >
        </core-ajax>
    

    现在我们有数据进入您的项目,我们需要处理这个问题。这是通过使用 Polymer 的数据绑定来完成的。

    让我们绕道您正在创建的元素。看不出下面这行有什么问题。

    <polymer-element name="profile-page" attributes="isprofile entity">
    

    我们有一个名为“profile-page”的元素,它有两个属性“isprofile”和“entity”。

    只是因为我的 Javascript 有一些不足之处,我会将每个属性作为一个单独的实体传递给该行

    <polymer-element name="profile-page" attributes="isprofile name companyposition OrgUnitName">
    

    然后在你的元素底部定义一个脚本标签

    <script>
        Polymer({
            name: "",
            companyposition: "",
            OrgUnitName: ""
            });
    </script>
    

    现在回到通话(个人资料页面)。以下代码(来自我的项目)具有以下内容;

        <template repeat="{{m in response.data}}">
            <map-list-element mapname="{{m.mapName}}" recordid="{{m.Id}}" on-show-settings="{{showSettings}}">
            </map-list-element> 
        </template>
    

    这里我们重复以下每个元素。在您的情况下,您只有一个条目,它存储在 jsonString 中,因此您的模板是这样的

        <template repeat="{{u in jsonString}}">
             <profile-page name="{{u.name}} companyposition="{{u.companyposition}}" OrgUnitName="{{u.OrgUnitName}}">
             </profile-page>
        </template>
    

    现在我们解决您遇到的问题。返回到您的 profie-page 元素。线路没有问题

    on-tap="{{edbutTapped}}"
    

    这会调用一个名为 edbutTapped 的函数。拿我之前给你的代码

    <script>
        Polymer({
             edbutTapped: function () {
                  this.$.usernameinput.disabled = false;
             }
        });
    </script>
    

    这里唯一要改变的是添加以下代码

    created: function() {
         this.$.usernameinput.disabled = true;
    },
    

    这是在 Polymer({ 行之后插入的。我在修改后的代码中看不到 usernameinput 的定义,但我假设你没有发布它并且它是在元素中定义的。

    而且你应该在工作,但请记住保持你的大小写一致,老实说我不是 - Polymer 的某些部分是区分大小写的 - 这一直让我感到困惑:)

    【讨论】:

    • 感谢您的详细回答,我就这样尝试过,core-ajax 的响应似乎是空的,没有绘制个人资料页面。另外,我真的需要重复的模板吗?我的意思是,不是一组对象,而是一个对象。即使我可以完成这项工作,我担心的是我写的只是我实际拥有的一个小例子,这意味着配置文件有更多的属性,而不仅仅是这三个,所以我希望我可以发送整个对象并在元素内处理它。这不可能吗?
    • 您可以使用 core-ajax 的 on-core-response 属性。将以下内容添加到 core-ajax on-core-response="{{handleResponse}}。然后将处理程序定义为自定义元素的脚本。handleResponse: function (event, detail, sender) { }, detail 应该包含结果 - 如果您使用以下 alert(JSON.stringify(detail)); 并且会以 JSON 字符串的形式显示详细信息 - 它应该包含由您的 JSON 组成的对象。
    猜你喜欢
    • 2015-07-16
    • 2017-02-24
    • 2021-07-26
    • 2021-09-18
    • 1970-01-01
    • 2014-11-08
    • 2018-01-25
    • 1970-01-01
    • 2016-01-22
    相关资源
    最近更新 更多