javascript - 在AngularJS中的 View 之间更改时保持范围模型

标签 javascript angularjs

我正在学习 AngularJS。假设我有 /view1 使用 My1Ctrl,而 /view2 使用 My2Ctrl;可以使用选项卡导航到每个 View 都有自己简单但不同的形式。

当用户离开然后返回 view1 时,我如何确保以 view1 形式输入的值不会被重置?

我的意思是,第二次访问 view1 怎么能保持模型与我离开时完全相同的状态?

最佳答案

我花了一些时间来找出最好的方法。我还想保持状态,当用户离开页面然后按下后退按钮时,回到旧页面;而不仅仅是将我所有的数据放入 rootscope

最终的结果是每个 Controller 都有一个服务。在 Controller 中,您只拥有您不关心的函数和变量,如果它们被清除的话。

Controller 的服务是通过依赖注入(inject)来注入(inject)的。由于服务是单例的,它们的数据不会像 Controller 中的数据那样被销毁。

在服务中,我有一个模型。该模型只有数据-没有功能-。这样它就可以从 JSON 来回转换以保持它。我使用 html5 本地存储进行持久化。

最后我使用 window.onbeforeunload$rootScope.$broadcast('saveState'); 让所有服务知道他们应该保存他们的状态,并且 $rootScope.$broadcast('restoreState') 让他们知道恢复他们的状态(分别用于当用户离开页面并按下返回按钮返回页面时)。

为我的 userController 命名为 userService 的示例服务:

app.factory('userService', ['$rootScope', function ($rootScope) {

    var service = {

        model: {
            name: '',
            email: ''
        },

        SaveState: function () {
            sessionStorage.userService = angular.toJson(service.model);
        },

        RestoreState: function () {
            service.model = angular.fromJson(sessionStorage.userService);
        }
    }

    $rootScope.$on("savestate", service.SaveState);
    $rootScope.$on("restorestate", service.RestoreState);

    return service;
}]);

用户 Controller 示例

function userCtrl($scope, userService) {
    $scope.user = userService;
}

然后 View 使用这样的绑定(bind)

<h1>{{user.model.name}}</h1>

app 模块 中,在运行函数中我处理 saveStaterestoreState广播

$rootScope.$on("$routeChangeStart", function (event, next, current) {
    if (sessionStorage.restorestate == "true") {
        $rootScope.$broadcast('restorestate'); //let everything know we need to restore state
        sessionStorage.restorestate = false;
    }
});

//let everthing know that we need to save state now.
window.onbeforeunload = function (event) {
    $rootScope.$broadcast('savestate');
};

正如我所提到的,这需要一段时间才能达到这一点。这是一种非常简洁的方法,但是在做一些我怀疑在 Angular 中开发时很常见的问题是相当多的工程。

我希望看到更简单但更简洁的方式来处理跨 Controller 保持状态,包括用户离开和返回页面的时间。

关于javascript - 在AngularJS中的 View 之间更改时保持范围模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12940974/

相关文章:

javascript - React redux 导入 reducer 调度

javascript - AngularJS中范围原型(prototype)/原型(prototype)继承的细微差别是什么?

javascript - 在 lodash.js 中,它会缓存 `.value()` 方法的结果吗?

javascript - 函数在angularJs中调用两次

css - 如何将 ng-style 与 !important 一起使用?

javascript - 元素的偏移量 - 内联 - 使用angularjs

javascript - Sails.js 的模型是否具有像 Django 中的模型那样的反向引用功能?

javascript - Jquery datepicker 和多个选择事件

html - 无法设置默认文本框值

javascript - AngularJS 错误未知提供者 : $$jqLiteProvider <- $$jqLite <- $animateCss <- $uibModalStack <- $uibModal