Javascript Sharepoint preaveaction总是得到var未定义



我需要在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的返回。

最新更新