使用Underscore JS partials和for循环的未定义变量对象

时间:2015-12-09 03:18:07

标签: javascript jquery underscore.js

我正在写一个twitter聚合器,我需要一些帮助才能解决错误'未捕获的ReferenceError:未定义sqTweetData'。看起来控制台指向我的for循环。我已经设置了一个部分,使用下划线js编译并加载到#main-content中。

For Loop Code

fs = TblserversFilter(data=query, queryset=...)
filtered_qs = fs.filter()

home.js编译代码

<!-- Main Content -->
<main class="main">
    <div class="container-flex" id="main-content"></div>
</main> <!-- End Main Content -->

<!-- Current Tweet Partials -->
<script id="active-tweet-partial" type="underscore/template">
    <section class="tweetFlexItem">

    <% for (var i = 0; i < sqTweetData.length; i++) { %>
        <div class="activeTweet">
            <div class="activeTweet__avatar"><img src="<%= sqTweetData[ i ].user.profile_image_url %>"></div>
            <div class="activeTweet__wrapper">
                <div class="activeTweet__name"> <%= sqTweetData[ i ].user.name %> </div>
                <div class="activeTweet__message"><%= sqTweetData[ i ].text %></div>
            </div>
        </div>
    <% } %>

    </section>
</script>

第11行的console.log工作正常,所以我假设我的变量对象设置正确。似乎在部分和其他javascript之间存在脱节。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

这是一个范围问题。 sqTweetData说这是未定义的,因为它正是如此。 window["sqTweetData"]不存在。当您在函数之外声明一个变量时,它会插入到全局命名空间中,在这种情况下,浏览器window就是命名空间。

由于您使用var关键字在家中声明变量,因此该变量只能在<{strong> Home函数中访问。因此,您必须将其添加为this.sqTweetdata并将其与对象一起返回,或者添加一个单独的getTweetData()来返回变量,或者沿着这些行添加某些内容。

查看这个非常全面地涵盖范围界定的答案: https://stackoverflow.com/a/500459/3629438

你的属于:

高级:关闭

var a = 1;

var six = (function() {   

  var a = 6;

  return function() {
    // JavaScript "closure" means I have access to 'a' in here,
    // because it is defined in the function in which I was defined.
    alert(a);   
  }; 
})();

修改

在你的情况下,你会按照

的方式做点什么
var Home = (function() {

// ....... //    

function getTweetData() {
   return sqTweetData;
}
return {
    init: initHome,
    get: getTweetData
};

})();