使用 Underscore JS partials 和 for 循环的未定义变量对象
Undefined variable object using Underscore JS partials and for loop
我正在编写一个 Twitter 聚合器,我需要一些帮助来解决错误 'Uncaught ReferenceError: sqTweetData is not defined.' 看起来控制台正在将我指向我的 for 循环。我已经设置了一个使用下划线 js 在 #main-content 中编译和加载的部分。
For循环代码
<!-- 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>
home.js 编译代码
var Home = (function() {
var sqTweetData = {
user: [{
profile_image_url : "assets/avatar.png",
name : "@johnsnow"
}],
text : "Someone once said that I know nothing..."
};
console.log("this is sqTweetData", sqTweetData);
// Partials
var tweetPartial = $('#active-tweet-partial').html();
tweetPartialCompiled = _.template( tweetPartial );
// DOM Handlers
// KICKSTART VIEW
function initHome() {
// load main content
$('#main-content').html(tweetPartialCompiled( sqTweetData ));
// bind events
}
return {
init: initHome
};
})();
第 11 行的 console.log 工作得很好,所以我假设我的变量对象设置正确。 javascript.
的部分和其余部分之间似乎存在脱节
有什么想法吗?
这是一个范围界定问题。 sqTweetData
说它是未定义的,因为它就是这样。 window["sqTweetData"]
不存在。当您在函数外部声明一个变量时,它会被插入到全局命名空间中,在这种情况下,浏览器 window
就是命名空间。
由于您使用 var
关键字在 home 内部声明变量,因此变量只能在 Home
函数中访问。因此,您必须将其作为 this.sqTweetdata
和 return 与对象一起添加,或者添加一个单独的 getTweetData()
作为 return 变量,或者类似的东西.
查看这个非常全面地涵盖了范围界定的答案:
你的属于:
高级:闭包
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
};
})();
我正在编写一个 Twitter 聚合器,我需要一些帮助来解决错误 'Uncaught ReferenceError: sqTweetData is not defined.' 看起来控制台正在将我指向我的 for 循环。我已经设置了一个使用下划线 js 在 #main-content 中编译和加载的部分。
For循环代码
<!-- 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>
home.js 编译代码
var Home = (function() {
var sqTweetData = {
user: [{
profile_image_url : "assets/avatar.png",
name : "@johnsnow"
}],
text : "Someone once said that I know nothing..."
};
console.log("this is sqTweetData", sqTweetData);
// Partials
var tweetPartial = $('#active-tweet-partial').html();
tweetPartialCompiled = _.template( tweetPartial );
// DOM Handlers
// KICKSTART VIEW
function initHome() {
// load main content
$('#main-content').html(tweetPartialCompiled( sqTweetData ));
// bind events
}
return {
init: initHome
};
})();
第 11 行的 console.log 工作得很好,所以我假设我的变量对象设置正确。 javascript.
的部分和其余部分之间似乎存在脱节有什么想法吗?
这是一个范围界定问题。 sqTweetData
说它是未定义的,因为它就是这样。 window["sqTweetData"]
不存在。当您在函数外部声明一个变量时,它会被插入到全局命名空间中,在这种情况下,浏览器 window
就是命名空间。
由于您使用 var
关键字在 home 内部声明变量,因此变量只能在 Home
函数中访问。因此,您必须将其作为 this.sqTweetdata
和 return 与对象一起添加,或者添加一个单独的 getTweetData()
作为 return 变量,或者类似的东西.
查看这个非常全面地涵盖了范围界定的答案:
你的属于:
高级:闭包
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
};
})();