我的应用程序中有一个演练,包含 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
我已尝试以下方法来解决,但均无效:
- 将 currentView 更改为 getter 函数 getCurrentView(),该函数返回 currentView。同样的行为。
- 将 currentView 设置器包装在 $scope.$apply 中。获取 $apply already in Progress 错误
- 将 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
});