angularjs - 路由时如何保留当前视图数据

Posted

技术标签:

【中文标题】angularjs - 路由时如何保留当前视图数据【英文标题】:angularjs - how to keep current view data when routing 【发布时间】:2015-01-17 07:39:26 【问题描述】:

我对 angularjs 有疑问。 2 有 2 个视图:

    视图 1 具有这些控件 名为 txtBox1 的文本框,默认值为空 一个名为“更改”的按钮,用于将 txtBox1 中的文本更改为“已更改!” 查看 2 名为 txtBox2 的文本框

首先我导航到 View1,点击按钮,txtBox1 的内容变为“Changed !”。然后我导航到 View2,然后我回到 View1。

那么我怎样才能保留我从 View1 输入到 txtBox1 的数据呢? 我用过 DurandalJs,他们有视图缓存选项,可以在导航时保持当前数据在视图中,但我不知道如何使用 angularjs?

【问题讨论】:

一些简化的代码可能会有所帮助,但基本思想是您应该创建一个供两个控制器使用的数据服务,并将值存储在视图 1 上。这也将允许 view2 在需要时访问它.如果不需要,view2 不需要引用服务,因为它将由应用实例化并保持实例化,直到应用关闭。 你能贴出你的代码吗? 【参考方案1】:

@jimmy ng:您是否希望即使在刷新后也能存储您的数据?这很重要。

如果您只希望这些值用于当前应用程序运行并假设每个主视图都有 1 个 ctrl,那么您可以通过帮助服务类(数据管理器服务)存储表单数据:

myapp.service('viewDataManager', [function () 
  var data = ;
  // TODO: optionally via html5 getter/setter way
  return 
    get: function (key)  return data[key]; ,
    set: function (key, newData)  data[key] = newData; 
  ;
]);

然后,在 view1Controller 的销毁中,您只需设置表单数据:

 $scope.$on('$destroy', function () 
   view1DataManager.set('view1FormData', $scope.myModel.formStates);
 );

同样,在 init/constructor 上,重新加载这些状态:

 $scope.init = function () 
   $scope.myModel.formStates = view1DataManager.get('view1FormData');
 ;

这是为了保留应用程序当前运行的数据。对于未来的实例,只需更新数据管理器以将其设置为 localStorage 或 websql 甚至 cookie(虽然不太推荐)。

注意:您也可以将几乎所有内容都存储在 $rootScope 中,但这只是您从任何角度看待它(架构、性能等)的核心。所以绝对是“不要去那里”的事情。

更新: @jimmyng:基本上不可能将这些状态存储在对象(又名 ctrl)中,因为对象(当然)正在被丢弃并按需再次实例化。

假设您所有的 UI 易失性数据都存储在“formStates”中,上面的代码将处理您需要的内容。您正在使用 AngularJS,因此小部件将绑定到 ng-model。你也可以把选择的选项放在那里等等。

// E.g.:
dropdownlist ---> ng-model -> formStates.selectedXXX
dropdownlist ---> ng-options-> formStates.xxxOptions
textbox ---> ng-model -> formStates.name
etc

【讨论】:

好吧,实际上我不想将表单数据存储在变量中。我想让我当前的控制状态在我导航到其他视图时不会改变。您可以想象在 View 1 上您已经完成了这些操作:选择一个下拉列表,输入一个文本框。然后导航到视图 2 以检查一些变量,然后返回视图 1 继续当前的工作。但是一切都没有了,View 1 被刷新了。

以上是关于angularjs - 路由时如何保留当前视图数据的主要内容,如果未能解决你的问题,请参考以下文章

从孙子导航到父子时,AngularJS UI 路由器数据仍然存在

angularJs ui-router路由之多视图实现菜单缓存切换

AngularJS UI 路由器:如何配置嵌套命名视图?

AngularJS 具有相同模板的多个路由不应重新渲染

AngularJs 在 UI 路由器状态视图中向 ag-grid 单元格添加按钮

AngularJS2