javascript - 引用错误: obj is not defined using webcomponents & polymer

标签 javascript jquery polymer web-component

这是我使用 Web 组件的第一个项目,我充其量只是 js/jquery 的菜鸟,所以我不确定为什么会发生这种情况。

我在“search-form.html”中内置了一个自定义元素,然后我的所有组件和脚本都通过索引头部的主“components.html”引入...

index.html:

<head>
    <meta charset='utf-8'>  
    <script src="/static/template/js/webcomponents.min.js"></script>
    <link rel="import" href="/static/template/components/components.html">
    <link rel="icon" type="image/png" href="/static/template/img/favicon.png">
</head>

组件.html:

<!-- POLYMER MUST BE LOADED -->
<link rel="import" href="/static/template/polymer/polymer.html">

<!-- TEMPLATE SCRIPTS -->
<link rel="import" href="/static/template/components/scripts.html">
<!-- Loads jquery and other scripts -->

<!-- TEMPLATE COMPONENTS -->
<link rel="import" href="/static/template/components/search-form.html">

然后 search-form.html 看起来像这样:

<!-- Defines element markup -->
<dom-module id="search-form">
<template>
    <div class="input-prepend input-append">
        <form id="search" method="get" action="/property/search">
            <div class="btn-group">
                <button id="search-type" class="btn btn-inverse dropdown-toggle" data-toggle="dropdown">
                    Search by
                    <span class="caret"></span>
                </button>
                <ul class="dropdown-menu">
                    <li><a data-name="city" data-label="city">City</a></li>
                    <li><a data-name="zip" data-label="zip">Zip Code</a></li>
                    <li><a data-name="mls" data-label="mls">MLS Number</a></li>
                </ul>
            </div>
            <input id="input-tag" class="input-xlarge" type="text" placeholder="Select a search type..." data-provide="typeahead" value="" />
            <button type="submit" class="btn"><i class="fa fa-search"></i></button>
        </form>
    </div>
</template>

<script>
/********************************
/ TYPEAHEAD ARRAY
/*******************************/
var obj = {
    "city" : [],
    "zip" : [],
};

$(document).ready(function() {
    /*dynamic zipcode*/ 
    for(i=43000; i<=45999;i++){
        obj.zip.push({val: i.toString(), string: i.toString()});
    }
    for(i=48000; i<=49999;i++){
        obj.zip.push({val: i.toString(), string: i.toString()});
    }
});

/********************************
/ SEARCH TYPEAHEAD FUNCTION
/*******************************/
$(function searchTag($) {   

    var data = [];

    $('.dropdown-menu > li > a').on("click", function() {
        data = $(this).data('name');
    });

    var that = this;
    $('#input-tag').typeahead({
        source: function(query, process) {
                var results = _.map(obj[data], function(value) {
                    return value.val;
                });
                process(results);
        },
        highlighter: function(val) {
            var value = _.find(obj[data], function(p) {
                return p.val == val;
            });
            return value.string;
        },
        updater: function(val) {
            var value = _.find(obj[data], function(p) {
                return p.val == val;
            });
            that.setSelected(value);
            return value.string;
        }
    });
    this.setSelected = function(value) {
        $('#input-tag').val(value.string);
        //$('#input-tag').attr('data-value', value.val);
        $('#input-tag').data('value', value.val);
    };
});

/********************************
/ QUICK SEARCH TAG FUNCTION
/*******************************/
$(function () {

    var caret = ' <span class="caret"></span>';

    function searchSelect() {
        $('.dropdown-menu > li > a').on("click", function() {
            $('#search-type').html($(this).text() + caret);
            $('#input-tag').attr('placeholder', $(this).data('label'));
            $('#input-tag').attr('name', $(this).data('label'));
        });
    }searchSelect();
});

Polymer({
        is: 'search-form',
        created: function() {},
        ready: function() {},
        attached: function() {},
        detached: function() {},
        attributeChanged: function(name, type) {}
});
</script>
</dom-module>

因此 var obj 在 search-form.html 中声明

最后,由于我们后端的编写方式,我必须在 index.html 上运行一个循环来获取要在 var obj 中使用的数组“城市”:[],

看起来像这样:

/*TYPEAHEAD ARRAY*/ 
//MUST BE RUN FROM SHELL BECAUSE OF THE TMPL LOOP
<!-- TMPL_LOOP Cities -->
    obj.city.push({val: "<!-- TMPL_VAR city_name -->", string: "<!-- TMPL_VAR city_name -->"})
<!-- /TMPL_LOOP -->

现在问题来了。这一切在 Chrome 中都可以正常工作,但我在 FF、IE11 和 Edge 中遇到相同的错误。该错误是:

ReferenceError: obj is not defined
obj.city.push({val: "ALLEN PARK", string: "ALLEN PARK"})

伙计,我希望我能很好地记录这一点,以便有人提供帮助,因为在转向堆栈之前我已经拉了我的头发好几个小时了:)

最佳答案

我认为当您访问index.html中的obj var时,导入尚未加载,因此此时obj未定义。由于 Chrome 本身支持 HTML 导入,因此导入会更早加载并在那里工作。将对 obj 的访问包装在 HTMLImports.whenReady(callback) 中。当所有 HTML 导入完成加载时,将调用回调。

HTMLImports.whenReady(function(){
    <!-- TMPL_LOOP Cities -->
    obj.city.push({val: "<!-- TMPL_VAR city_name -->", string: "<!-- TMPL_VAR city_name -->"})
    <!-- /TMPL_LOOP -->
});

关于javascript - 引用错误: obj is not defined using webcomponents & polymer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32492648/

相关文章:

javascript - 谷歌地图的国家形状

javascript - Firestore startAt 返回 null

javascript - 将 jquery 数据发送到 struts Action

javascript - 在 Controller 中从指令获取值到 $scope

javascript - 获取在 hidden/shown.bs.collapse 上折叠的元素

javascript - 当我拖动一个点时更新数据

polymer 1.0 : Accessing elements by id in dom-repeat

javascript - 获取 Iron-ajax 响应作为 javascript 变量

javascript - 使用 javascript/jquery 访问影子 DOM 属性( polymer )?

javascript - IE 支持多个 Angular ng 类表达式