![](/img/trans.png)
[英]How can I make use of a JavaScript variable across two separate functions?
[英]How can I use Global variable across multiple functions in JavaScript?
我有一段代碼,旨在檢查用戶的權限級別和組成員身份,並在用戶具有訪問該站點的正確權限的情況下啟動對話框。
function bindSettingsButton() {
$("#mt-ngw-personalsettings").on("click", function() {
RequestNewSite();
});
}
function RequestNewSite() {
var HasPermission = false;
var isGroupMember = false;
CheckCurrentUserMembership();
CheckUserHasEditPermissions();
CheckUserPermissions();
}
function CheckCurrentUserMembership() {
var clientContext = new SP.ClientContext.get_current();
this.currentUser = clientContext.get_web().get_currentUser();
clientContext.load(this.currentUser);
this.userGroups = this.currentUser.get_groups();
clientContext.load(this.userGroups);
clientContext.executeQueryAsync(OnQuerySucceeded, OnQueryFailed);
}
function OnQuerySucceeded() {
var isMember = false;
var groupsEnumerator = userGroups.getEnumerator();
while (groupsEnumerator.moveNext()) {
var group = groupsEnumerator.get_current();
if(group.get_title() == "Create Site OptOut") {
isMember = true;
this.isGroupMember = true;
break;
}
}
}
function OnQueryFailed()
{
alert("Couldn't check user group membership. Please contact to resolve this issue.");
}
function CheckUserHasEditPermissions() {
context = new SP.ClientContext.get_current();
web = context.get_web();
this._currentUser = web.get_currentUser();
this._theList = web.get_lists().getByTitle('siterequests');
context.load(this._currentUser);
context.load(this._theList, 'EffectiveBasePermissions')
context.executeQueryAsync(Function.createDelegate(this, this.onPermissionsSuccessMethod), Function.createDelegate(this, this.onPermissionsFailureMethod));
}
function onPermissionsSuccessMethod(sender, args) {
if (this._theList.get_effectiveBasePermissions().has(SP.PermissionKind.editListItems))
{
this.HasPermission = true;
}
else
{
this.HasPermission = false;
}
}
function onPermissionsFailureMethod()
{
alert("Couldn't check permissions. Please contact to resolve this issue.");
}
function CheckUserPermissions() {
if(this.isGroupMember == true)
{
alert("You do not have permission to create sites. If you believe you should have access to this functionality, please contact .");
}
else if(this.HasPermission == false)
{
alert("You do not have permission to create sites. If you believe you should have access to this functionality, please contact .");
}
else
{
showDialogue();
document.getElementById("next-stage").focus();
}
}
不幸的是,到本節末尾時,變量HasPermission和isGroupMember仍未定義,因此該對話框將自動為每個用戶啟動。 我有一種誤用.this關鍵字的感覺,這是一個范圍界定錯誤,但是我對JS不夠了解,無法確定或能夠解決它。 誰能確切告訴我我做錯了什么以及如何解決?
$("#mt-ngw-personalsettings").on("click", function() { RequestNewSite(); });
如果希望將RequestNewSite
用作構造函數,則需要使用new
進行分配。 如果作為函數調用,則不會創建對象(因此不會創建狀態)。
另外,需要在this
顯式創建該類型的所有成員。
所以
function RequestNewSite() { var HasPermission = false; var isGroupMember = false; CheckCurrentUserMembership(); CheckUserHasEditPermissions(); [...]
需要是
function RequestNewSite() {
this.HasPermission = false;
this.isGroupMember = false;
this.CheckCurrentUserMembership();
this.CheckUserHasEditPermissions();
[...]
您正在執行異步功能,這意味着即使您首先開始的工作尚未完成,其余代碼也將繼續執行。 在onPermissionsSuccessMethod
和OnQuerySucceeded
函數完成之后,您將必須調用CheckUserPermissions
。
除此之外, HasPermission
和isGroupMember
變量對於RequestNewSite函數來說是本地的,這意味着它們不在CheckUserPermissions
函數的范圍內。
var HasPermission = false;
var isGroupMember = false;
var CompletedCallbacks = 0;
function bindSettingsButton() {
$("#mt-ngw-personalsettings").on("click", function() {
RequestNewSite();
});
}
function RequestNewSite() {
CheckCurrentUserMembership();
CheckUserHasEditPermissions();
}
function CheckCurrentUserMembership() {
var clientContext = new SP.ClientContext.get_current();
this.currentUser = clientContext.get_web().get_currentUser();
clientContext.load(this.currentUser);
this.userGroups = this.currentUser.get_groups();
clientContext.load(this.userGroups);
clientContext.executeQueryAsync(OnQuerySucceeded, OnQueryFailed);
}
function OnQuerySucceeded() {
var isMember = false;
var groupsEnumerator = userGroups.getEnumerator();
while (groupsEnumerator.moveNext()) {
var group = groupsEnumerator.get_current();
if(group.get_title() == "Create Site OptOut") {
isMember = true;
isGroupMember = true;
break;
}
}
CompletedCallbacks++;
CheckUserPermissions();
}
function OnQueryFailed()
{
alert("Couldn't check user group membership. Please contact SPCOE@capita.co.uk to resolve this issue.");
}
function CheckUserHasEditPermissions() {
context = new SP.ClientContext.get_current();
web = context.get_web();
this._currentUser = web.get_currentUser();
this._theList = web.get_lists().getByTitle('siterequests');
context.load(this._currentUser);
context.load(this._theList, 'EffectiveBasePermissions')
context.executeQueryAsync(Function.createDelegate(this, this.onPermissionsSuccessMethod), Function.createDelegate(this, this.onPermissionsFailureMethod));
}
function onPermissionsSuccessMethod(sender, args) {
if (this._theList.get_effectiveBasePermissions().has(SP.PermissionKind.editListItems))
{
HasPermission = true;
}
else
{
HasPermission = false;
}
CompletedCallbacks++;
CheckUserPermissions();
}
function onPermissionsFailureMethod()
{
alert("Couldn't check permissions. Please contact SPCOE@capita.co.uk to resolve this issue.");
}
function CheckUserPermissions() {
if(CompletedCallbacks != 2) return;
if(isGroupMember == true)
{
alert("You do not have permission to create sites. If you believe you should have access to this functionality, please contact SPOCOE@capita.co.uk.");
}
else if(HasPermission == false)
{
alert("You do not have permission to create sites. If you believe you should have access to this functionality, please contact SPOCOE@capita.co.uk.");
}
else
{
showDialogue();
document.getElementById("next-stage").focus();
}
}
此代碼應該起作用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.