我正在为我们的一个项目构建一个实时主题选择器,它可以工作。那太棒了!但是我还有一个错误,我无法解决,这让我发疯。
这就是问题所在:在您加载主题选择器页面的那一刻,主干应用程序(它使用 Backbone JS、Underscore JS 和 jQuery 构建)启动。在初始化时,应用程序会查找几件事,其中一件事是:我需要为当前主题使用什么颜色集(当前主题设置存储在数据库中)。
这是在初始化时调用的函数:
// Select the colorset for the first time a new theme is picked
selectColorset: function( newTheme ) {
// Check or this is a new theme or not
var themeCheck = ( typeof newTheme !== "undefined" ) ? true : false,
colorset = ( !themeCheck ) ? parseInt( $("#js-colorset-input").val() , 10 ) : 0;
// Select the right list
$("#js-theme-colors ul").eq( colorset ).addClass("selected-set");
this.renderColorStyle( colorset );
}
如您所见,此功能有两种使用方式:第一种是初始化,另一种是切换到其他主题。
首先我查了一下:为什么要调用这个函数?它是在更改事件上调用,还是在初始化时调用。如果在初始化时调用它,newTheme 变量将不会保存任何数据。
初始化时,颜色集编号将是页面上隐藏字段中的数字。所以现在我们有了颜色集编号,我们可以渲染颜色集样式表(this.renderColorStyle(colorset)):
// Insert the color stylesheet
renderColorStyle: function( colorset ) {
// Check or the colorset is given
if( typeof colorset === "undefined" || colorset === "" ) {
colorset = 0;
}
// Define the stylesheet for this theme
if( $("#js-theme-iframe").contents().find("#js-theme-colorset").length > 0 ) {
// Change the current stylesheet
$("#js-theme-iframe")
.contents()
.find("head #js-theme-colorset")
.attr("href", "stylesheets/themes/theme-" + this.themeID + "/theme-color-" + colorset + ".css");
} else {
// Insert a new stylesheet
var stylesheet = $("<link />", {
href: "stylesheets/themes/theme-" + this.themeID + "/theme-color-" + colorset + ".css",
rel: "stylesheet",
id: "js-theme-colorset"
});
// Append the stylesheet to the iframe
$("#js-theme-iframe").contents().find("head").append( stylesheet );
}
}
正如你所看到的,我首先检查或者我们有一个颜色集(只是为了确定),因为我们在初始化时没有颜色集样式表,所以我们要构建一个。这是用 jQuery 完成的。如您所见,我正在使用 href、rel 和 id(用于查找颜色集样式表)构建元素。
但是jQuery在初始化时一直给我一个空数组。所以样式表不在那里。所有数据都在那里,当我使用console.log()函数查看或数据真的在那里时,结果证明它是。所以不是这样。
但我真的不知道为什么会这样。因为如果我在主题更改时调用这些函数,一切正常,jQuery 创建样式表。所以只有在初始化时它不起作用,它让我发疯。
希望有人可以向我解释每次调用完全相同的函数是如何可能的,但是在初始化时,它有一个不同于主题更改的输出(具有相同的数字和变量)。