2016-02-05 80 views
1

我这个片段添加到每个javascript文件在我的asp.net网页API应用程序使用多个负载,以避免多个负载:避免的JavaScript文件

Fullcalendar.js

blog = {}; 
blog.comments = blog.comments || {}; 
blog.comments.debugMode = false; 

blog.isFirstLoad = function (namesp, jsFile) { 
    var isFirst = namesp.jsFile.firstLoad === undefined; 
    namesp.jsFile.firstLoad = false; 
    return isFirst; 
}; 

$(document).ready(function() { 
    if (!blog.isFirstLoad(blog.comments, "fullcalendar.js")) { 
     return; 
    } 
}); 

有时我一个奇怪的例外

Uncaught TypeError: Cannot read property 'firstLoad' of undefined

我需要知道:

  1. 为什么会发生这种情况?
  2. 我该如何解决?

回答

1

那里有几个问题。

首先,您不应该首先加载该文件,因此不应该通过尝试确定是否加载该文件来完成此项业务。

但是,如果你想这样做:

第一个实际的问题是,你总是这样:

blog = {}; 

...这意味着,如果有已经是一个全球blog,你”重新清除它的价值并用一个空的对象替换它。如果要使用现有的全球价值或创建一个新的,做到这一点:

var blog = blog || {}; 

这似乎很奇怪,但由于反复var声明的罚款(和不改变变量),将使用现有的价值,或者如果没有(或者它的价值是假的)它将创建一个新的并且用{}对它进行初始化。

于是,线路

namesp.jsFile.firstLoad = false; 

...查找一个名为上namesp财产,并假定它不是nullundefined。它不查找使用参数值的属性。

要做到这一点,使用括号注释:

namesp[jsFile].firstLoad = false; 

即使是这样,不过,你假定它不是nullundefined,但它可能是。你可能只是想:

namesp[jsFile] = false; 

或者可能:

namesp[jsFile] = namesp[jsFile] ||{}; 
namesp[jsFile].firstLoad = false; 

这就是说,它看起来非常奇怪使用blog.comments跟踪是否JavaScript文件已加载。如果该文件可能已经被加载,只是这将做到这一点:

var fullCalendarLoaded; 
if (fullCalendarLoaded) { 
    // It's already loaded 
} else { 
    // It isn't, but it is now 
    fullCalendarLoaded = true; 
    // ...do your init... 
} 

或者,如果你有这几条,并想用一个单一的全球性吧:

var loadedScripts = loadedScripts || {}; 
if (loadedScripts.fullCalendar) { 
    // Already loaded 
} else { 
    // Not loaded yet 
    loadedScripts.fullCalendar = true; 
    // ...do init... 
} 

或者,如果使用文件名是很重要的:

var loadedScripts = loadedScripts || {}; 
function firstLoad(filename) { 
    if (loadedScripts[filename[) { 
     return false; 
    } 
    // Not loaded yet, remember we've loaded it now 
    loadedScripts[filename] = true; 
    return true; 
} 

然后:

if (firstLoad("fullcalendar.js")) { 
    // First load, do init... 
} 
1

这是相当简单:

在您初次运行,您可以定义

blog = {}; 
blog.comments = blog.comments || {}; 
blog.comments.debugMode = false; 

从理论上讲,这意味着在某些负载,blog是:

var blog = { 
    comments: { 
    debugMode: false 
    } 
} 

然后,您可以通过blog.comments到您的功能isFirstLoad作为namesp参数。在该功能,你做了评价:

namesp.jsFile.firstLoad === undefined; 

好吧,你从来没有定义的blog.comments的财产。这意味着它是未定义的。试图访问未定义变量的属性firstLoad会给你你的错误

Uncaught TypeError: Cannot read property 'firstLoad' of undefined