在 ng-if 上的跨平台应用程序中延迟显示 UI

Posted

技术标签:

【中文标题】在 ng-if 上的跨平台应用程序中延迟显示 UI【英文标题】:Delay displaying UI in cross platform app on ng-if 【发布时间】:2017-08-15 05:55:39 【问题描述】:

我有一个使用 Monaca 和 AngularJS 构建的跨平台应用程序。

在某些屏幕上,我显示一个通用视图,然后根据使用 ng-ifng-include.

例如对于登录屏幕,我显示一个通用视图,而在我的控制器中,我检查用户之前是否登录过。根据此查找的结果,我会显示欢迎消息或提示用户登录。

下面是通用login视图的缩略版。

<div>
    <ons-page>
        <ons-scroller >
            <!-- Show if user not logged in -->
            <div ng-if="!loggedIn">
                <div ng-include="'login/login-details.html'"></div>
            </div>
            <!-- Show if user logged in -->
            <div ng-if="loggedIn">
                <div ng-include="'login/login-confirmation.html'"></div>
            </div>
        </ons-scroller>
    </ons-page>
</div>

这工作正常,但问题是第一个 ng-if 总是显示 - 即使只是一秒钟 - 而控制器检查用户是否已登录in 然后设置 loggedIn 的值。因此,用户始终会看到登录提示,直到控制器在变量 loggedIn 上返回 true 或 false。

loggedIn 的布尔值只是在控制器中定义但未初始化。它只有在查找完成后才会启动。

我怎样才能阻止两个 ng-include 的显示,直到我知道要显示哪一个?

我可以创建另一个 ng-if,但它似乎冗长且效率低下。

【问题讨论】:

我不确定,但也许ng-cloak 会有所帮助。如果不只是添加 ng-showng-if 中相同的条件。 我不知道你的控制器/服务中发生了什么,但你可能没有使用承诺。 @Ben Beck - 不,我没有使用承诺。我正在使用异步调用来检查用户是否已登录,这使得查找时间更长。我会尝试 ng-cloak,如果不行,我会实现一个承诺。 也可能是您的登录回调机制不是基于角度的(即由window.addEventListener 之类的东西触发),那么回调不是角度感知的,也不会触发摘要。然后一个简单的$scope.$applyAsync() 就解决了这个问题。此外,一秒钟的延迟听起来像角度自动摘要触发器。 【参考方案1】:

我还将使用 ng-show 并隐藏项目,直到使用 ng-hide 类对其进行评估,见下文:

<div class="ng-hide" ng-show="!loggedIn">
    <div ng-include="'login/login-details.html'"></div>
</div>
<!-- Show if user logged in -->
<div class="ng-hide" ng-show="loggedIn">
    <div ng-include="'login/login-confirmation.html'"></div>
</div>

【讨论】:

【参考方案2】:

您可以使用的一种方法是如果loggedInnullundefined,直到您检查用户登录的天气,您可以对truefalse 使用严格的比较运算符===所以:

<div>
    <ons-page>
        <ons-scroller >
            <!-- Show if user not logged in -->
            <div ng-if="loggedIn === false">
                <div ng-include="'login/login-details.html'"></div>
            </div>
            <!-- Show if user logged in -->
            <div ng-if="loggedIn === true">
                <div ng-include="'login/login-confirmation.html'"></div>
            </div>
        </ons-scroller>
    </ons-page>
</div>

这将确保在您的“查找”结果之前都不会显示。

根据您选择的路由,该问题的另一个解决方案是使用ngRoute's 或ui-routerresolve 属性。这样您就可以在视图加载之前检查用户是否已登录。

【讨论】:

以上是关于在 ng-if 上的跨平台应用程序中延迟显示 UI的主要内容,如果未能解决你的问题,请参考以下文章

三星 Bada 平台上的 J2ME UI

winform中进度条(ProgressBar)控件使用时UI画面显示延迟的解决

C# 中 UI 线程和子进程之间的低延迟 IPC [关闭]

"Ng-If ="0" <div>" 的内​​容显示在 un-"collapse" 上

图像上的触摸事件,通过使用 UIButton 实现,但与 UIImageView 相比显示延迟

Android 为啥使用Handler