angular save / serialize $ scope state

时间:2015-11-02 12:00:34

标签: javascript angularjs

我构建了一个非常复杂的控制器,其中包含许多模型和观察者。 我希望能够保存Controller模型的当前状态,这样用户就可以点击“保存到草稿”。

我考虑过序列化整个$ scope对象,但它似乎是impossible

你对这个问题有什么优雅的解决方案吗?

4 个答案:

答案 0 :(得分:2)

优雅的答案可能是尝试序列化您尝试从$ scope保留的数据,并在需要时重新应用(将其保存到server / cookies / localstorage)。

为什么要尝试保留整个范围对象,而不仅仅是您需要的数据?

但是,我可能不会完全理解你的问题。

此外,如果你正在使用诸如angular-ui-router之类的stame机器,你可以保持当前的页面状态。

答案 1 :(得分:2)

您应该将所有模型放在一个$scope字段中,例如state

$scope.state = {model1: 'value 1', model2: 'value 2'};

然后,您可以存储仅存储此单个字段的完整控制器状态。

答案 2 :(得分:1)

您不应使用$scope将所有数据存储到其中。使用服务和提供商。通过这样做,您可以使用在不同控制器上创建的服务,而无需重写代码。您的所有逻辑都应该在那些不在控制器中的服务中。服务是单件,它在您的控制器之间共享。只使用$ scope将模型公开到你的html中,如果你不需要模板中的数据,不要把它放在那里。如果你在$ scope中放入太多数据,你的应用程序将运行得更慢,因为它将被添加到$ watch

答案 3 :(得分:0)

这就是我保留$scope状态副本的方法(使用lodash):

function copyScope(scope) {
    return _.pick(scope, function (index, key) {
        return typeof (scope[key]) !== 'function' && key.charAt(0) !== '$';
    });
}

在我的控制器中,我监控$scope状态的变化:

$scope.$watch(function watchScope() {
    return copyScope($scope);
}, function saveScope(scopeCopy) {
    // stateManager stores it as JSON in local storage
    stateManager.set(stateKey, scopeCopy);
}, true);

要加载状态,只需使用反序列化的JSON并将其放在您的范围内:

angular.extend($scope, JSON.parse(scopeCopyJson));