簡體   English   中英

如何在JavaScript中的多個函數中使用Global變量?

[英]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();
  [...]

您正在執行異步功能,這意味着即使您首先開始的工作尚未完成,其余代碼也將繼續執行。 onPermissionsSuccessMethodOnQuerySucceeded函數完成之后,您將必須調用CheckUserPermissions

除此之外, HasPermissionisGroupMember變量對於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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM