我需要在PreSaveAction中做一个验证,如果一个字段(demofield)等于yes,如果是这样,调用一个名为ViewItem的函数,ViewItem检查是否存在一个值,并将"result"的值更改为yes或NO;Result也是一个全局变量。但是由于某种原因,当我改变"成功"函数内的"结果"的值,它不会改变全局变量"结果"。我做错了什么,或者有其他方法可以使这个验证发生吗?
var result; // This is always undefined
function ViewItem()
{
var context = new SP.ClientContext.get_current();
var web = context.get_web();
var list = web.get_lists().getByTitle('demoTrainingRoom2');
var query = SP.CamlQuery.createAllItemsQuery();
allItems = list.getItems(query);
context.load(allItems, 'Include(Title, EventDate, time2)');
context.executeQueryAsync(Function.createDelegate(this, this.success), Function.createDelegate(this, this.failed));
}
function success() {
var currentTitle = SPUtility.GetSPFieldByInternalName('EventDate').GetValue();
for(var i = 0; i < this.allItems.get_count(); i++){
var item = this.allItems.get_item(i);
console.log(item.get_item('time2') + ' - ' + currentTitle );
if (currentTitle == item.get_item('time2')){
this.result = "Yes"; //// here is where i change the value of result
alert('There is an event with the same Start Date on DemoTrainingRoom2' + ' ' + item.get_item('time2') + ' - ' + currentTitle + ' ' + result);
return true; // or item
}
}
this.result = "No"; // here is where i change the value of result
alert("No event yet");
return false;
}
function failed(sender, args) {
alert("failed. Message:" + args.get_message());
}
function PreSaveAction() {
var time = SPUtility.GetSPFieldByInternalName('EventDate').GetValue();
alert(time + " Current Start Time ");
if(SPUtility.GetSPField('demoField').GetValue() == "no")
{
alert('No need for validation');
return true;
}
else if(SPUtility.GetSPField('demoField').GetValue() == "yes")
{
ViewItem();
if(result == "Yes") // here is here i need the new value of result globlal
{
alert(result);
return false;
}
else
{
alert(result); // i always get here cuz result global is undefined
return true;
}
}
}
更新function ViewItem(listTitle, Success, Error) {
var context = new SP.ClientContext.get_current();
var web = context.get_web();
var list = web.get_lists().getByTitle(listTitle);
var query = SP.CamlQuery.createAllItemsQuery();
//variable local
var allItems = list.getItems(query);
context.load(allItems, 'Include(Title, EventDate, tiempo2)');
context.executeQueryAsync(function(){
var currentTitle = SPUtility.GetSPFieldByInternalName('EventDate').GetValue();
var res = "No";
for (var i = 0; i < allItems.get_count(); i++) {
var item = allItems.get_item(i);
console.log(item.get_item('tiempo2') + ' - ' + currentTitle );
if (currentTitle == item.get_item('tiempo2')){
res = "Si"; // aca segun yo le cambio el valor a result
console.log('There is an event with the same Start Date on DemoTrainingRoom2'
+ ' ' + item.get_item('tiempo2') + ' - ' + currentTitle);
//return true; // or item
}
}
return Success(res);
},
Error
);
}
function PreSaveAction() {
var time = SPUtility.GetSPFieldByInternalName('EventDate').GetValue();
alert(time + " Current Start Time ");
if(SPUtility.GetSPField('demoField').GetValue() == "no") {
alert('No need for validation');
return true;
}
else if(SPUtility.GetSPField('demoField').GetValue() == "yes") {
//llamo a esta pa ver si hay items con valores duplicados
var res2 = ViewItem('demoTrainingRoom2', function(res){
console.log('Resultado: ' + res);
if(res == "Si") //deberia de entrar si result fuera Si
{
alert(res);
return false;
}
else
{
alert(res); //Pero siempre entra aca por que result es undefined
return true;
}
},
function (sender, args) {
alert("failed. Message:" + args.get_message());
}
);
return res2;
}
}
你的成功ViewItem()函数依赖于一个异步请求,所以当你检查结果变量时,ViewItem的成功函数还没有执行,它的结果变量仍然是不变的。
你可以将ViewItem()中的代码移到你的PreSaveAction函数中,并使success()成为一个自执行的匿名函数,它将负责PreSaveAction的返回。