【问题标题】:How to set a flag in my Single Page Application如何在我的单页应用程序中设置标志
【发布时间】:2013-07-05 23:01:36
【问题描述】:

在我的单页应用程序中(以热毛巾为模型,durandal.js、knockout.js 和 require.js),我试图设置一个标志 (HasAccess) 以指示用户是否已通过身份验证。我在一个名为 shell.js 的文件中执行此操作。该文件在每个视图中运行(index.vbhtml 引用 main.js,main.js 将应用程序根设置为 shell 视图,它在每个视图中运行 shell.js)。这是 shell.js 视图模型代码-

define(['durandal/system', 'durandal/plugins/router', 'services/logger', 'services/SecurityDataService'],
        function (system, router, logger, SecurityDataService) {

            var HasAccess = ko.observable(HasAccess);

            var vm = {
                activate: activate,
                router: router
            };
        return vm;

        function UserHasAccess() {
                return SecurityDataService.getHasAccess(HasAccess);
        }

        function activate() {
                return boot();
        }

        function boot() {
                HasAccess = SecurityDataService.getHasAccess();
                if HasAccess == "True") {
                    router.mapNav('home');
                    router.mapNav('CAApproval');

                    log('LucasNet Loaded!', null, true);


                return router.activate('home');
                }
                else {
                    router.map([
                        { url: 'AccessDenied', moduleId: 'viewmodels/AccessDenied', name: 'AccessDenied', visible: false }
                    ]);


                        return router.activate('AccessDenied'); // should show details page of a particular folder
                    log('Access Denied!', null, true);
                }
        }

        function log(msg, data, showToast) {
                logger.log(msg, data, system.getModuleId(shell), showToast);
        }
    });

包含 getHasAccess 的文件位于名为 SecurityDataService.js 的数据服务文件中。那个代码是-

define(['services/logger', 'durandal/system'],
        function (logger, system) {
            var SecurityModel = function (HasAccess) {
                var self = this;
                self.HasAccess = ko.observable(HasAccess);
        };


        var getHasAccess = function (strHasAccess) {
                $.getJSON('/api/security', function (data) {

                    strHasAccess = "";
                    if (typeof (data) == "string") {
                            strHasAccess = data;
                    } else {
                            strHasAccess = "False";
                    }

                    return strHasAccess;
                });
        }


        var dataservice = {
                getHasAccess: getHasAccess
        };

        return dataservice;

    });

编辑添加了我的控制器代码

Public Class SecurityController
    Inherits ApiController

        ' GET api/security
    Public Function GetValues()
            Dim boolHasAccess As String = ""
            Try

                    Dim objUser As LucasEntities.Business.IEF_WUserID = New LucasEntities.Business.EF_WUserID



                    Dim objSecurity As New LucasEntities.Business.EF_Security

                    boolHasAccess = objSecurity.GetUserPermissionsJSON(Utilities.GetLogin(), "CAAPPRV")

            Catch ex As Exception
                    Dim shouldRethrow As Boolean =     ExceptionPolicy.HandleException(ex, "Policy")
                    If shouldRethrow Then
                        Throw
                    End If
            End Try



            Return boolHasAccess

        End Function
End Class



    Return boolHasAccess

End Function

我遇到的问题是进入启动方法中的 else 语句,然后它在 SecurityDataService.js 中运行对 getHasAccess 的调用(在激活 AccessDenied 视图之后)。

如何在确定显示哪个视图之前先设置 HasAccess 标志(如果已通过身份验证,则为主页视图,如果未通过身份验证,则为 AccessDenied 视图)?

【问题讨论】:

    标签: jquery asp.net-mvc-4 knockout.js single-page-application durandal


    【解决方案1】:

    getHasAccess 正在进行 $.getJSON 调用,因此您可能需要通过 '$.when()to make sure thatgetHasAccess` 将其包装,然后再继续。

    一些事情。

    function boot() {
      return  $.when(SecurityDataService.getHasAccess()).then(function(HasAccess){
    
            if (HasAccess == "True") {
                router.mapNav('home');
                router.mapNav('CAApproval');
    
                log('LucasNet Loaded!', null, true);
    
    
            return router.activate('home');
            }
            else {
                router.map([
                    { url: 'AccessDenied', moduleId: 'viewmodels/AccessDenied', name: 'AccessDenied', visible: false }
                ]);
    
    
                    return router.activate('AccessDenied'); // should show details page of a particular folder
                log('Access Denied!', null, true);
            }
        };
    
    }
    

    顺便说一句,此时shell.js 顶部的var HasAccess = ko.observable(HasAccess); 被定义为可观察的,但在boot() 中它被作为普通变量处理HasAccess = SecurityDataService.getHasAccess();

    【讨论】:

    • 感谢 RainerAtSpirit。如果我想将 HasAccess 用作普通变量,应该如何声明它?
    • var HasAccess = ''; 正如您所期望的那样保持strHasAccess。一旦你实现了对boot 的更改,你可能会考虑完全摆脱它,因为我在示例中的其他任何地方都看不到它。
    • $.when(SecurityDataService.getHasAccess()).then(function (HasAccess) { 带它到 var getHasAccess = function (HasAccessObservable) { $.getJSON('/api/security', function ( data) { strHasAccess = ""; if (typeof (data) == "string") { strHasAccess = data; } else { strHasAccess = "False"; } return strHasAccess; }); } 但它没有命中代码getJSON 调用,直到显示 accessdenied 视图之后。想法?
    • 我还添加了我的 web api 控制器代码。也许问题在那里?见编辑
    • 还要注意 HasAccess 返回为未定义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-19
    • 1970-01-01
    • 2011-09-22
    • 1970-01-01
    • 2011-05-11
    • 1970-01-01
    • 2020-05-16
    相关资源
    最近更新 更多