我构建了一个非常复杂的控制器,其中包含许多模型和观察者。 我希望能够保存Controller模型的当前状态,这样用户就可以点击“保存到草稿”。
我考虑过序列化整个$ scope对象,但它似乎是impossible。
你对这个问题有什么优雅的解决方案吗?
答案 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));