我正在使用 requireJS
,并且需要根据条件 a == true
改变请求的文件数量。
目前我正在这样做,但不起作用:
// ok
var baseRequestWidgets = $('html').attr('init') != true
? [ "text!../tmp/page/tmp_page_header_generic.html"
,"text!../tmp/page/tmp_page_header_specific.html"
,"text!../tmp/widgets/tmp_widget_header.html"
,"text!../tmp/widgets/tmp_widget_navbar.html"
,"text!../tmp/page/tmp_page_footer.html"
]
: [ "text!../tmp/widgets/tmp_widget_header.html"
,"text!../tmp/widgets/tmp_widget_navbar.html"
]
// not ok
, baseRequestObjects = $('html').attr('init') != true
? page_header_generic, page_header_specfic, page_widget_header, page_widget_navbar, page_footer
: page_widget_header, page_widget_navbar
require( baseRequestWidgets, function( baseRequestObjects
/*
page_header_generic
, page_header_specfic
, page_widget_header
, page_widget_navbar
, page_footer
*/
){ ... }
问题是我无法使用 baseRequestObjects
将对象传递给函数。文件被正确请求,但 baseRequestObjects
不起作用。
问题:
有什么想法我做错了吗?谢谢!
编辑:
我收到的错误是 page_header_generic is not Defined
,所以我假设我的 page_header_generic 声明是在请求底层文件之前完成的???
编辑:
更接近... RequireJS 使用 baseRequestObjects
来存储第一个请求的文件,而实际上它是可变数量的请求文件的占位符。
所以问题应该是: 当包含 x 个对象名称的占位符被误解为单独的占位符名称本身时,如何将动态数量的对象名称传递给 requireJS?
编辑:
所以这有效,不确定我喜欢它,因为我没有传递任何东西......
var baseRequestWidgets = function(trigger){
var passBack;
if ( trigger == "true" ){
passBack = [ "text!../tmp/widgets/tmp_widget_header.html"
,"text!../tmp/widgets/tmp_widget_navbar.html"
];
} else {
passBack = [ "text!../tmp/widgets/tmp_widget_header.html"
,"text!../tmp/widgets/tmp_widget_navbar.html"
,"text!../tmp/page/tmp_page_header_generic.html"
,"text!../tmp/page/tmp_page_header_specific.html"
,"text!../tmp/page/tmp_page_footer.html"
];
}
return passBack;
}
, getBaseRequestObjects = function( temps) {
var objArr = [];
for ( var i = 0; i < temps.length; i++){
var thisString = temps[i],
addToArray = temps[i].match(/tmp_(.*?)\.html/);
objArr.push( addToArray[1] )
}
return objArr;
}
, baseRequestObjects
我需要将其放入一个函数中,因为两个变量都必须是动态的。
然后我像这样调用 require:
// inside my event call
var ...
widgetsForThisRequest = baseRequestWidgets(trigger),
baseRequestObjects = getBaseRequestObjects( widgetsForThisRequest );
require( widgetsForThisRequest,
function( /* dynamic */ ) {
// this will be dnyamic strings
console.log( widgetsForThisRequest );
// this will be dynamic objects
console.log( baseRequestObjects );
// loop using arguments - not sure if I like this
for ( i = 0; i < baseRequestObjects.length; i++){
widget = arguments[i];
tempName = baseRequestObjects[i];
...
因此,我没有传递任何对象,并且必须使用参数
在循环内手动设置小部件。似乎可行,但不确定这是正确的方法。无论如何,有超过 2 或 5 个字符串,因此必须有超过 2 或 5 个物体携带相应的字符串。现在我还好,但如果有人知道更好的方法,感谢分享!
最佳答案
标记为“不好”的代码并没有按照您的想法进行操作;您不能创建这样的变量。
我只是重新排序您的包含内容,以便您始终请求的两个文件排在第一位,然后检查您的定义中是否存在其他模块。
var baseRequestWidgets = $('html').attr('init') != true
? [ "text!../tmp/widgets/tmp_widget_header.html"
,"text!../tmp/widgets/tmp_widget_navbar.html"
,"text!../tmp/page/tmp_page_header_generic.html"
,"text!../tmp/page/tmp_page_header_specific.html"
,"text!../tmp/page/tmp_page_footer.html"
]
: [ "text!../tmp/widgets/tmp_widget_header.html"
,"text!../tmp/widgets/tmp_widget_navbar.html"
]
require( baseRequestWidgets, function( page_widget_header
, page_widget_navbar
, page_header_generic
, page_header_specfic
, page_footer
){
// page_widget_header and page_widget_navbar are always loaded
// page_header_generic, page_header_specfic and page_footer
// are undefined if init === true
}
关于javascript - 如何改变js中的函数参数并且所有参数都是对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12859075/