使用 Angular 时如何在内联页面容器中显示 Auth0 Lock?

How to show Auth0 Lock in an inline page container when using Angular?

我正在使用 Auth0 Lock 对用户进行身份验证,我正在尝试让 Lock 小部件不是作为弹出窗口而是嵌入在页面本身中。

我尝试使用 container 选项并从我希望它加载的页面中的脚本调用 lock.show() 方法,但它没有。只有当我从 ng-click 中的函数内部调用 lock.show() 方法时,它才会显示小部件。

正在初始化锁定小部件:

lockProvider.init({
        clientID: 'XXX',
        domain: 'YYY.auth0.com',
        options: {
            allowSignUp: false,
            container: 'hiw-login-container',
            auth: {
                responseType: 'token',
                params: {
                    scope: 'openid email'
                }
            },
            allowedConnections: ['Username-Password-Authentication']
        }
    });

观点:

 <div ng-if="!isAuthenticated" >
   <script>
       lock.show();
    </script>
    <md-content>
        <div id="hiw-login-container" style="width: 320px; margin: 40px auto; padding: 10px; border-style: dashed; border-width: 1px; box-sizing: border-box;">
             embedded area
         </div>
     </md-content>
 </div>

ng-click 调用 lock.show:

<md-button class="md-warn md-raised"
           aria-label="Login"
           ng-click="toolbar.authService.login()"
           ng-if="!isAuthenticated">
  Login
</md-button>

function login() {
    lock.show();
}

我无法上传图片,所以这里是 运行 应用程序显示结果的链接:

  1. 初始状态 - 在按下任何按钮之前 (HomePage before pressing the login button)
  2. 按下登录按钮后(HomePage after pressing login button)

为什么它不从一开始就显示小部件?

您正在使用 Angular,因此任何依赖于其渲染管道的 Javascript 代码,因为它使用由 Angular 本身管理的 HTML 元素遵守这些规则。

当您从 ng-click 调用它时 Angular 已经完成了它的工作,Lock 将正确找到目标元素并正确显示。

当您尝试从内联脚本调用 lock.show 时,您无法保证 Angular 已经完成处理并且不会正常工作。

您需要从 Angular 感知的代码调用 lock.show;你可以考虑一些事情:

function YourController($scope) {
   $scope.$on('$viewContentLoaded', lock.show);
}

angular.element(lock.show);

甚至考虑使用一个指令来理解 Angular 何时使 HTML 元素可用并调用 lock.show.