Polymer 2.0 dom-if基于功能输出

时间:2017-05-04 13:34:23

标签: javascript polymer

相对的聚合物新手在这里,但不是JS的新手。想了解为什么以下代码片段不起作用。简而言之,我会有一个用户对象,它将在页面加载后填充。该对象的属性是NSCollectionViewItem,它只是一个字符串数组。

roles条件正在调用dom-if,该函数将返回true,但是......我觉得我只是在这里错过了一些基本概念而且一直在猛烈反对谷歌一两天。

我想要清楚,hasRole函数在页面加载时被调用,但之后不会被调用。虽然我意识到我可以让hasRole('user')成为一个bool,但我需要为每个可能的角色创建属性,并希望auth系统比这更灵活。

目前,隐藏的" admin only"部分永远不会出现。

对不起,如果这是一个简单或愚蠢的问题或其他什么,它只是我不完全理解的东西,也许甚至不知道谷歌的正确条款。

我正在使用Polymer 2.0.0-rc.3

user.isAdmin

3 个答案:

答案 0 :(得分:4)

你的代码看起来很好,但hasRole函数只被调用一次(在第一次渲染时)。

尝试使用属性而不是函数...这样dom-if将根据该属性值进行渲染。

这应该有效:

<link rel="import" href="../../bower_components/polymer/polymer-element.html">
<link rel="import" href="../../bower_components/polymer/lib/elements/dom-if.html">

<dom-module id="test1-app">
  <template>
    <style>
      :host {
        display: block;
      }
    </style>
    <button on-click="toggle">Toggle</button>
    This is visible...

    <template is="dom-if" if="{{domif}}">
        but this is hidden.
    </template>
  </template>

  <script>
    /** @polymerElement */
    class Test1App extends Polymer.Element {
      static get is() { return 'test1-app'; }
      static get properties() {
        return {
          user: {
            type: Object
          },
          domif: {type: Boolean,
                  value: true}
        };
      }
      toggle() {
        this.domif = !this.domif;
        if(this.user) {
          this.user = null;
        }
        else {
          this.user = {
            name: 'Carl',
            roles: ['admin','user']
          }
        }
      }

      static get observers() {
        return [
          'userChanged(user.*)'
        ]
      }
      hasRole(role) {
        console.log('calling hasRole')
        if(this.user && this.user.roles && this.user.roles.indexOf(role)>=0) {
          this.domif = true;
          return true;

        }
        else {
          this.domif = false;
          return false;
        }
      }

      userChanged() {
          //just observing for the sake of observing
          console.log(this.user);

      }

    }

    window.customElements.define(Test1App.is, Test1App);
  </script>
</dom-module>

答案 1 :(得分:0)

如果您使用的是原生的Polymer 2.0元素(您可以按照我的意愿去做),那么您应该使用<dom-if>元素

https://www.polymer-project.org/2.0/docs/about_20#type-extension

如果您在Polymer 2.0中使用混合元素,则应使用<dom-bind>包装dom-if。

根据Polymer 2.0升级指南:

  

如果您有任何模板扩展元素-dom-bind,dom-if或   dom-repeat-在主文档中,将它们转换为包装形式。

https://www.polymer-project.org/2.0/docs/upgrade

您可以在部分的自定义元素API&gt;下找到它。删除类型扩展元素

答案 2 :(得分:0)

像这样改变你的dom-if条件

 <dom-if if={{condition}}>
    <template>
    code inside template
    </template>
    </dom-if>

这对我有用。