ReferenceError:obj未使用webcomponents&聚合物

时间:2015-09-10 03:27:13

标签: javascript jquery polymer web-component

这是我的第一个使用网页组件的项目,我最好是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>

components.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 中使用该数组“city”:[],

看起来像这样:

/*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"})

男人,我希望我能够记录下这个,以便有人帮忙,因为我一直把头发拉了几个小时才转向堆叠:)

1 个答案:

答案 0 :(得分:1)

我认为当您访问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 -->
});