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/

相关文章:

html - 带有 polymer 的空白页

javascript - 如何使用 Three.js 曲线作为移动网格的路径

php - .load() 不为未缓存的图像触发 - jquery

javascript - 我可以在 JSFiddle 上使用 Polymer 吗?

javascript - 在插入符号位置插入嵌套元素

php - 如何使用 ajax 在 Laravel 中删除单个记录

javascript - Checkbox 的 checked 属性绑定(bind) - Polymer

php - 使用 JQuery/PHP 的跨域 Ajax 请求

javascript - 如何在 HTML 页面中使用 jquery 或 javascript 发送邮件

javascript - 调用服务打开对话框取决于 setTimeout