2015-11-02 41 views
2

我已經構建了一個非常複雜的控制器,有很多模型和觀察者。 我希望能夠保存Controller模型的當前狀態,因此用戶將能夠點擊「保存到草稿」。

我想到了序列化整個$範圍的對象,但它似乎是impossible

你對這個問題有什麼優雅的解決方案嗎?

+1

爲什麼它「不可能」?完全可能。 – dfsq

+0

有什麼問題?如何把這些數據放入一個對象中:'$ scope.somethingToSerialize = {...}' – pablochan

+0

你應該只是序列化數據 - 而不是整個'$ scope' – Michael

回答

2

你應該把你所有的車型在一個$scope場如state

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

然後你可以存儲完整的控制器狀態只存儲這個單一字段。

2

優雅的答案可能會嘗試序列化你試圖從$範圍保留的數據,當您需要它(將其保存到服務器/餅乾/ localStorage的)重新塗抹。

爲什麼試圖保留整個範圍對象,而不僅僅是你需要的數據?

雖然我可能無法完全掌握您的問題。

此外,如果您使用的是stame機,如角UI的路由器,就可以保留當前頁面的狀態。

+0

,我找了優雅的解決方案不是抄襲逐一... 買還是謝謝你! – Wazime

+0

這就是模特的重點:)不客氣。 –

+0

Plus的角度擴展了'$ scope'對象的東西,讓它可以跟蹤它的狀態等等,你不想複製和應用它們,你可能會說可能導致短路。如'$ parent,$$ childHead,$$ listeners,$ id,$$ watchers' – ste2425

1

你不應該使用$scope您的所有數據存儲到。使用服務和提供商。通過這樣做,您可以使用您在不同控制器上創建的服務,而無需重寫代碼。你的所有邏輯都應該在那些不在控制器中的服務中。服務是單一的,它是通過你的控制器共享的。只有使用$ scope才能將模型公開到您的html中,如果您不需要模板中的數據,請不要放在那裏。如果你把太多的數據在$範圍內,您的應用程序運行速度會變慢,因爲它會被添加到$看

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));