2015-07-12 63 views
1

我對茉莉花相對較新。我讀了下面的代碼教程:

angular.module('moduleX', []).controller('HomeCtrl',function($scope) { 
    $scope.showData = function(data) { 
    $scope.$broadcast('showData', data); 
    }; 
}); 

下面是測試:

beforeEach(inject(function ($rootScope, $controller) { 
    scope = $rootScope.$new(); 
    $controller('HomeCtrl', { 
     $scope: scope 
    }); 
    spyOn(scope, '$broadcast'); 
})); 

it('should call $broadcast', function() { 
    scope.showData(); 
    expect(scope.$broadcast).toHaveBeenCalled(); 
}); 

我的問題是如何一切正常?如果scope = $ rootScope。$ new();那麼我假設範圍變成了一個全新的空範圍,並且範圍上沒有showData方法,那麼scope.showData()如何工作?我認爲$控制器只有幫助實例化一個新的HomeCtrl,但它沒有分配給任何變量(我期望看到類似於var homeCtrl = $controller('HomeCtrl', {$scope: scope});)我不確定在這種情況下它是否與範圍變量有關?


一些注意事項:我做一些的console.log看到的範圍變量:

scope = $rootScope.$new(); 
    console.log("scope before",scope) 
    $controller('HomeCtrl', { 
    $scope: scope 
    }); 
    console.log("scope after",scope) 

我可以看到,現在有showData在「後的範圍」,所以$控制器已修改原來的範圍變量。我不確定爲什麼,並認爲這種方式有點不直觀。

回答

0

$控制器服務負責實例化控制器。 https://docs.angularjs.org/api/ng/service/ $控制器

在第一個代碼示例創建控制器,它需要$範圍的依賴和創造功能showData爲$ scope屬性。

在beforeEach新的空範圍創建和明年$控制器服務被稱爲 - 這就是意味着 創建我「HomeCtrl」實例和$範圍參數是由範圍(在以前的行創建新的空範圍)

通過

調用控制器實例化控制器構造函數,它將showData方法添加爲$ scope屬性。

順便說一句,更好的解決方案是使用controllerAs語法,因爲然後控制器是標準的JS構造函數與此方法而不是$ scope(this.showData例如)