我已經構建了一個非常複雜的控制器,有很多模型和觀察者。 我希望能夠保存Controller模型的當前狀態,因此用戶將能夠點擊「保存到草稿」。
我想到了序列化整個$範圍的對象,但它似乎是impossible。
你對這個問題有什麼優雅的解決方案嗎?
我已經構建了一個非常複雜的控制器,有很多模型和觀察者。 我希望能夠保存Controller模型的當前狀態,因此用戶將能夠點擊「保存到草稿」。
我想到了序列化整個$範圍的對象,但它似乎是impossible。
你對這個問題有什麼優雅的解決方案嗎?
你應該把你所有的車型在一個$scope
場如state
。
$scope.state = {model1: 'value 1', model2: 'value 2'};
然後你可以存儲完整的控制器狀態只存儲這個單一字段。
優雅的答案可能會嘗試序列化你試圖從$範圍保留的數據,當您需要它(將其保存到服務器/餅乾/ localStorage的)重新塗抹。
爲什麼試圖保留整個範圍對象,而不僅僅是你需要的數據?
雖然我可能無法完全掌握您的問題。
此外,如果您使用的是stame機,如角UI的路由器,就可以保留當前頁面的狀態。
你不應該使用$scope
您的所有數據存儲到。使用服務和提供商。通過這樣做,您可以使用您在不同控制器上創建的服務,而無需重寫代碼。你的所有邏輯都應該在那些不在控制器中的服務中。服務是單一的,它是通過你的控制器共享的。只有使用$ scope才能將模型公開到您的html中,如果您不需要模板中的數據,請不要放在那裏。如果你把太多的數據在$範圍內,您的應用程序運行速度會變慢,因爲它會被添加到$看
這是我如何保持$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));
爲什麼它「不可能」?完全可能。 – dfsq
有什麼問題?如何把這些數據放入一個對象中:'$ scope.somethingToSerialize = {...}' – pablochan
你應該只是序列化數據 - 而不是整個'$ scope' – Michael