我构建了一个巨大的backbone.js应用程序,它以这种方式工作:
如您所见,有一个数据 backbone.js模型,其中的值由 Getters.js 中的getter访问,值在中使用下划线模板以定义一些内联样式。页面中的内容存在于另一个Backbone模型中,称为内容。
该页面基本上由三个元素构成:菜单,内容和底栏。这些元素中的每一个都有自己的模板,但它们都包含在同一个模板中。这意味着View.js在其render()函数中,通过运行主模板来填充页面主体,主模板显示菜单,其中包括内容和底栏模板。
在我将其部署到生产中之前,这非常有效;数据骨干模型是根据来自另一个应用程序的JSON文件构建的,我不知道的是, JSON有时可能与我对吸气剂的预期不同。这意味着某些值可能会丢失,一些预期为字符串的值可能是包含该字符串的对象,依此类推。
这是一个很大的问题,因为吸气剂经常产生"无法读取undefined"的值颜色。如果它们所做的只是从骨干模型返回值,那就没问题,因为它们只会返回未定义的值或其他值而不是预期值。但是因为它们还做了一些逻辑(在我的例子中由getBottomBarColor所示),它们会得到未定义或意外类型的值并尝试使用它,这会使它们崩溃。
模板嵌套,并由browserify.js预编译为JS函数。这意味着如果一个getter在某个时刻崩溃,整个函数(这意味着整个模板)崩溃,导致一个空白页。
代码已经投入生产,改变构建整个应用程序的方式为时已晚。我一直在想办法处理格式错误的数据问题。 我的getters.Js文件是3000行大所以要进行一些手动编辑以便在其中随处放置try catch会太长,所以我想在getters.js的末尾添加这样的东西:
_.each(getters, function(getterFunction, getterName){
getters[getterName] = function(){
try{
return getterFunction.apply(this, arguments);
} catch(e){
sendErrorToDevByAjax(e, getterName);
return "";
}
}
});
这可以避免getter中的崩溃,但这会很慢(尝试catch),这不是牢不可破的,因为我在崩溃的情况下返回一个空字符串,如果模板在那里预期一个字符串就可以了,但是如果模板期望一个bool或一个对象,它无论如何都会崩溃(所以我也必须在模板调用中放置try catch,在我看来这会变得太慢)
如果有人知道我可以采取哪些措施来防止崩溃,或者我想做的事情更好,我很乐意接受它。