2014-08-28 51 views
2

最初我以为$ scope会自动注入到Angular JS的控制器中,但现在我感到困惑。我写了一小段代码。

的index.html

<html ng-app> 
    <body ng-controller="Controller"> 
    <input type="text" ng-model="fname"> 
    <span ng-bind="fname"></span> 
<body> 
</html> 

的script.js

angular.module('docsSimpleDirective', []) 
.controller('Controller', ['$http', function($scope) { 
    $scope.fname = 'Foo Bar'; 

}])

正如你可以看到这里我不注入$范围控制器。加载页面时,它不会在文本字段或跨度上显示“Foo Bar”。但是,当我开始在文本字段上写一些值时,它反映了跨度。这意味着在范围内声明'fname',但它为什么没有在页面加载显示。 当我注入$ scope时,一切正常。

+3

您注射'$ http'到控制器,但称这是'$ scope'。 – 2014-08-28 11:45:02

+0

@JimCote:不,我有意传递$ http,因为我需要它,它只是一小段代码来显示示例 – user3427540 2014-08-28 12:12:19

+0

数组中的字符串列表应该与控制器函数的参数匹配。否则,缩小会打破你的应用程序。您的代码不会将$ http注入到控制器中。 – 2014-08-28 22:53:23

回答

3

你有一对不同的事情在进行。

首先,你需要以某种方式将应用程序绑定到DOM,在这种情况下,你命名你的模块docsSimpleDirective,所以你需要添加ng-app="docsSimpleDirective一个同级别或以上的控制器

<!-- added ng-app="docsSimpleDirective" --> 
<div ng-app="docsSimpleDirective" ng-controller="Controller"> 
    <input type="text" ng-model="fname"> 
    <span ng-bind="fname"></span> 
</div> 

,您正在使用数组注释来定义依赖关系,这很好。如果你不这样做,并且你试图丑化你的代码,你会遇到问题。您目前拥有该方式的方式不会将$scope传递给您通过$http且名称为$scope的控制器。

angular.module('docsSimpleDirective', []) 
.controller('Controller', ['$scope', function($scope) { 
      // Not ['$http', function($scope).... 
    $scope.fname = 'Foo Bar'; 
}]) 

如果你想通过$scope$http它会像这样被定义的控制器。

.controller('Controller', ['$scope','$http', function($scope,$http) { 

总之你可以做.controller('Controller', ['$scope','$http', function(foo,bar) { ...foo将等于$scopebar就等于$http。这样做是为了当代码被丑化并且uglifiery不会更改$scope$http的文字字符串,以便引用不会被破坏。

Here is a working Fiddle

+0

是否需要在$ http之前传递$ scope?这个命令很重要吗? – user3427540 2014-08-28 12:23:41

+0

不,他们可以以任何顺序。 – Malkus 2014-08-28 12:24:39

+0

So $范围必须注入所有需要的情况下? – user3427540 2014-08-28 12:32:25

相关问题