2017-06-16 65 views
-3

我有一些基本的角代码敛导航菜单为登录和注销的用户,并存储在菜单$localStorage然后将它们切换到$rootScope当输入/输出等右侧分配 - 这怎么可能?

下面在用户登录就是一个简化版本代码为这个问题的目的。

看起来好像其中一行代码实际上会导致左侧被分配到右侧。

$localStorage.navigation = {}; 
$rootScope.nav = {}; 

// save the nav menus in local storage 
$localStorage.navigation.loggedIn = "nav menu json";  

// use local storage to set the rootscope 
$rootScope.nav = $localStorage.navigation; 

/* should be.. 
    $rootScope.nav = {loggedIn:'nav menu json'}; 
    $localStorage.navigation = {loggedIn:'nav menu json'}; 
*/ 

// set the nav menu - Right-hand-assignment??? 
$rootScope.nav.current = $localStorage.navigation.loggedIn; 

/* should be.. 
    $rootScope.nav = { loggedIn:'nav menu json', current: 'nav menu json' }; 
    $localStorage.navigation = { loggedIn:'nav menu json' }; 
*/ 

console.log($rootScope.nav.current); // 'nav menu json' as expected 
console.log($localStorage.navigation.current); // 'nav menu json', WHAT??!! 

/* actually.. 
    $rootScope.nav = { loggedIn:'nav menu json', current: 'nav menu json' }; 
    $localStorage.navigation = { loggedIn:'nav menu json', current: 'nav menu json' }; 
*/ 

在这里发生了什么?

+1

这个'$ rootScope.nav = $ localStorage.navigation;'传递一个对象引用...覆盖最初的空对象。 –

回答

3

因为$localStorage.navigation是一个对象不是原始(BooleanNumberString),这条线分配参考,而不是一个复制的$localStorage.navigation$rootScope.nav

$rootScope.nav = $localStorage.navigation; 

此时,$localStorage.navigation$rootScope.nav是两个引用完全相同的对象。这条线:

$rootScope.nav.current = $localStorage.navigation.loggedIn; 

是一个分配的原始值$localStorage.navigation.loggedIn$rootScope.nav.current,但由于$localStorage.navigation$rootScope.nav是完全相同的对象,$localStorage.navigation.current指的是相同的值$rootScope.nav.current

需要明确的是,右手工侧面任务是不可能

+0

看起来好像我今天学到了东西。谢谢! – yevg

+0

我很高兴它帮助! – bkbooth