AngularJS UI-Router 中动态改变视图

2024-02-24

我的应用程序中有一个演练,包含 4 页。我决定将演练设为具有多个视图的单一状态,以代表 4 个页面中的每一页。

在我的 html 中,我将 div 定义为指向当前视图的 ui-view,然后我的控制器根据需要进行更改。

问题是,当我将 $scope.currentView 更新为“常规”时,它不会改变屏幕上实际看到的内容!如果我在 _init 函数中手动将其更改为“常规”,它确实会显示常规页面,但我无法根据按钮单击来更改它。

HTML:

<div ui-view="{{currentView}}@walkthrough"></div>

控制器:

var _init = function () {
    $scope.currentView = 'welcome';
};
_init();

$scope.setView = function (view) {
    $scope.currentView = view;
};

我的状态定义:

.state('walkthrough', {
    url: '/walkthrough',
    views: {
        '': {
            templateUrl: 'app/walkthrough/walkthrough.html',
            controller: 'walkthroughController'
        },
        'welcome@walkthrough': {
            templateUrl: 'app/walkthrough/welcome.html'
        },
        'general@walkthrough': {
            template: 'general'
        }
    }
})

以及更新视图的按钮:

<img class="start-button center-block" ng-click="setView('general')" />

Update 1

我已尝试以下方法来解决,但均无效:

  1. 将 currentView 更改为 getter 函数 getCurrentView(),该函数返回 currentView。同样的行为。
  2. 将 currentView 设置器包装在 $scope.$apply 中。获取 $apply already in Progress 错误
  3. 将 currentView setter 包装在 $timeout 中。相同的行为

Update 2

我添加了一个<pre>调用与 ui-view 中相同的代码的部分,{{currentView}}@walkthrough。即使页面本身不更新以显示新视图,它也会显示正确的视图。

Update 3

我已经尝试了如何以编程方式设置视图的每种组合,但我尝试过的任何方法都不起作用。我是否使用服务器来获取视图、函数、直接 $scope 变量,什么都没有。变量本身是正确的,但当我更改变量时视图不会改变。

奇怪的是,当我在 init() 函数中设置 currentView 的值时,它会工作一次。如果我将值更改为代码本身中的下一个视图之一($scope.currentView = 'general'

我已经尝试了各种 $scope.$applys、$digests 和 $timeouts。我所做的任何事情都不会更新视图本身。剩下的唯一的事情就是用 ng-show/hide 将其变成一堆 div,这真的很难看并且管理起来很痛苦,这也是我首先想使用视图的原因。

Update 4

无论我尝试什么,仍然没有进展...我认为将变量更改包装在 $timeout 中的一些奇怪组合可能会被证明是有用的,但可惜,什么也没有。我最后的想法是将所有这些更改为它们自己的独立状态,但最终我会得到一堆重复的代码,这显然不好。我在应用程序的其他部分使用几乎相同类型的更改(不过要更改状态,而不是视图),并且效果完美。我不明白为什么我不能动态更改视图。任何帮助将不胜感激。

Update 5

在下面的用户评论后有一些家,但没有任何结果。我尝试调用所有方式的 $state 更改来刷新视图,但没有任何效果。我尝试了以下所有操作,但都没有对页面产生任何影响:

$state.reload();
$state.go($state.current, {}, { reload: true });
$state.transitionTo($state.current, $stateParams, {
    reload: true,
    inherit: false,
    notify: true
});

虽然 ui-view 指令将采用插值({{ something }})对于视图名称,它实际上并不监视它的更改。相反,视图更新仅由$stateChangeSuccess and $viewContentLoading事件。这就是为什么您可以第一次并且只能第一次观察到它工作的原因。

您可以通过查看链接函数来验证这一点$ViewDirective在 ui-router 的源代码中:https://github.com/angular-ui/ui-router/blob/master/src/viewDirective.js https://github.com/angular-ui/ui-router/blob/master/src/viewDirective.js.

这意味着您的setView函数需要调用$state.go触发状态更改,而不仅仅是在范围上设置属性。作为通常的状态改变过程,这最终将导致$stateChangeSuccess事件正在广播。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AngularJS UI-Router 中动态改变视图 的相关文章

  • 如何更改传单中功能集的样式?

    我正在看等值区域的例子 https leafletjs com examples choropleth https leafletjs com examples choropleth 这是他们使用的数据源 type Feature prop
  • 将 visjs 网络导出为 jpeg/png 图像

    我正在研究 Angular vis js Vis js 在画布上工作 用于创建节点和节点之间的链接 有没有办法从 visj s 画布中获取图像 jpeg png 看看这个片段 我想它会对你有所帮助 在 vis 画布下 您将看到一个 PNG
  • 如何在ASP.NET Webform中使用Jquery表单插件?

    我遇到了这个插件 http malsup com jquery form getting started http malsup com jquery form getting started 我想知道如何在 ASP NET WebForm
  • 非 DOM 对象上的 jQuery 自定义事件

    我最近阅读了一些代码 其功能如下 bob name Bob Smith rank 7 bob bind nameChanged function bob trigger nameChanged 这似乎有效 但我在 jQuery 文档或源代码
  • 动画进度元素值

    我有一个progress元素 该元素如下所示 div class container div div div
  • 如何使用canvas.toDataURL()将画布保存为图像?

    我目前正在构建一个 HTML5 Web 应用程序 Phonegap 本机应用程序 我似乎不知道如何将画布保存为图像canvas toDataURL 有人可以帮我吗 这是代码 有什么问题吗 我的画布被命名为 canvasSignature J
  • jquery window.open 在 ajax 成功中被阻止

    尝试在我的 ajax 成功调用中打开一个新的浏览器窗口 但是 它被阻止为弹出窗口 我做了一些搜索 发现用户事件需要绑定到 window open 才能避免这种情况发生 我还找到了这个解决方案 您可以在 ajax 之前打开一个空白窗口 然后在
  • Node.js - console.log 不显示数组中的项目,而是显示 [Object]

    我在注销对象内数组的内容时遇到问题 实际的物体看起来像这样 var stuff accepted item1 item2 rejected response Foo envelope from The sender to new item1
  • javascript中按tab键时如何调用函数?

    我有一个这样的功能 function whenEmpty field if field value field style backgroundColor ffcccc alert Please fill the field field f
  • 如何流式传输 OpenAI 的完成 API?

    我想流式传输结果通过 OpenAI 的 API 完成 https beta openai com docs api reference completions 该文档提到使用服务器发送的事件 https developer mozilla
  • 在d3.js中将2D形状转换为3D,并根据ANGULAR中的值调整高度

    我正在使用 d3 js v6 创建以下 2D 图表表示的 3D 图表 这个圆圈中有多个正方形 每个正方形都根据值分配了一种颜色 值越大 正方形越暗 现在我想将其转换为 3D 形状 其中当值变高时 只有特定正方形的高度会增加 因此结果在某种程
  • 使用 JS 合并具有相同值的相邻 HTML 表格单元格

    我已经为此苦苦挣扎了一段时间 我有一个根据一些 JSON 数据自动生成的表 该数据可能会有所不同 我想合并第一列中具有相同值的相邻单元格 例如此表中的 鱼 和 鸟 table tr td fish td td salmon td tr tr
  • JS用正则表达式替换数字

    我有元素的标识符 如下所示 form book 1 2 3 我想要的是用其他值替换该标识符中的第二个数字 我将函数 match 与以下正则表达式一起使用 var regexp d d d 但它返回我包含的数组 1 2 3 2 因此 当我尝试
  • IE11不监听MSFullscreenChange事件

    我正在尝试使用 Bigscreen js 在 IE11 中使用全屏 但 IE11 不监听 MS FullscreenChange 事件 document addEventListener MSFullscreenChange functio
  • 当 Angular 由于数据更改而完成更新布局时如何调用函数

    我有一个 ng repeat 指令 它显示链接列表 它工作正常 但我的代码还有一个 JavaScript 函数 它根据列表的尺寸放置列表 当然 在 Angular 完成数据绑定和修改 DOM 之前 列表的维度是未知的 如果我在数据更改后立即
  • 查询为空 Node Js Sequelize

    我正在尝试更新 Node js 应用程序中的数据 我和邮递员测试过 我的开发步骤是 从数据库 MySQL 获取ID为10的数据进行更新 gt gt 未处理的拒绝SequelizeDatabaseError 查询为空 我认识到 我使用了错误的
  • 当用户单击链接时,如何记录 MixPanel 事件?

    当用户单击某种类型的链接时 我试图在 MixPanel 中记录一个事件 我正在使用 JQuery 不引人注意地完成此操作 据我所知 我需要添加一个回调函数 以便在记录事件后将用户带到 URL 这是我正在使用的代码 不幸的是
  • 如果数字小于 10,则显示前导零 [重复]

    这个问题在这里已经有答案了 可能的重复 JavaScript 相当于 printf string format https stackoverflow com questions 610406 javascript equivalent t
  • Jquery - 通过在字符串中构建 id 的 id 获取元素

    我在使用 jquery 元素时遇到问题 我正在 var 中构造名称 例如 var myId myGotId myId attr title changed myId 返回空 我想通过 id 获取我的元素 但动态构建我的 Id 连接字符串 编
  • 如何在 gulp.src 中使用基本正则表达式?

    我正在尝试选择两个文件gulp src highcharts js and highcharts src js 当然 我知道我可以使用数组表达式显式添加这两个表达式 但出于学习目的 我尝试为它们编写一个表达式 我读过可以使用简单的正则表达式

随机推荐