2014-10-31 120 views
0

我注意到在我的一個控制器中,我獲得了$ rootScope和$ scope注入,並且它們都指向相同的對象。角根範圍和範圍問題

此外,在我所有的其他控制器中,$ scope對象是共享的。所以無論何時我注入作用域,它都包含在迄今爲止已經實例化的所有其他控制器中分配給它的屬性/方法。

這不是我從一開始就開發的應用程序,它非常龐大。我之前沒有看到過這種行爲,我不知道從哪裏開始診斷。任何想法是什麼造成這種情況?

,我們正在建立我們的控制器的通道/指令是非常標準的,它看起來像這樣:

angular.module('myApp') 
    .directive('mainNav', function() { 
    return { 
     restrict: 'A', 
     templateUrl: 'scripts/directives/mainNav/mainNav.html', 
     controller: 'mainNavCtrl', 
     replace: true, 
     link: function(scope, element) { 
      //Do DOM-related stuff 
     }); 
     } 
    }; 
    }) 
    .controller('mainNavCtrl', function($rootScope, $scope, $state) { 
    //Do controller stuff 
    }); 

我們還可以配置我們的應用程序如下:

angular.module( '對myApp',[ 'ui.router', 'kendo.directives'])
的.config(函數($ stateProvider,$ urlRouterProvider){$ urlRouterProvider.otherwise( '/');

$stateProvider 
    .state('app', { 
    url: '/', 
    templateUrl: 'views/app.html', 
    resolve: { 
     //Fetch stuff 
    } 
    }) 
    ; }); 

針對Kursad Gulseven的評論,這是我所看到的在Batarang:

Batarang screenshot

ID爲002的範圍被傳遞作爲$範圍和$ rootScope到第一控制器。當屬性添加到$ scope時,它們顯示在$ rootScope上。然後所有其他控制器正在接收ID爲00A的範圍。因此,添加到$ scope的這些控制器中的屬性對於獲得$ scope注入的所有其他控制器都是可見的。

+0

子範圍繼承父範圍的屬性,除非被覆蓋。也許這就是發生了什麼事。 – Shomz 2014-10-31 22:12:23

回答

0

$ rootScope和$ scope是而不是相同的對象。

如果您有根範圍內命名anObject一個對象,它有一個名爲anAttribute的屬性;那麼你可以像這樣使用$ scope來訪問該屬性:

$scope.anObject.anAttribute 

這是因爲如果Angular在$ scope中找不到對象時,會查找父範圍。

UPDATE:

你mainNav指令應通過增加scope: true有一個繼承子作用域。 當「範圍」爲false(這是指令的默認設置)時,父控制器和指令的控制器共享相同的範圍對象。設置範圍true將爲該指令創建一個新的子範圍。

+0

那麼,我注意到,rootScope和範圍都有相同的ID(在這種情況下是002)。另外,當我在控制器的作用域中添加屬性時,它們也顯示在rootScope上。不像rootScope上的子屬性,而是rootScope本身。 – lintmouse 2014-11-01 03:24:41

+0

你在Batarang範圍樹上看到什麼?一個ID爲002的單個作用域或許多嵌套作用域都具有ID 002? – 2014-11-01 22:30:26

+0

好的,看看我的問題更新。 – lintmouse 2014-11-02 13:57:55