为什么我们需要在这里使用$ scope?

时间:2014-08-11 12:17:59

标签: javascript angularjs

(function() {
    var app = angular.module("someawesomemodule", []);

    app.factory('data', function(){
        return { sometest: 'x' };
    });

    app.controller("FirstController", function( $scope, data ) {
        $scope.data = data;
        $scope.data.sometest = "a";
    });
})

为什么这不起作用?

(function() {
    var app = angular.module("someawesomemodule", []);

    app.factory('data', function(){
        return { sometest: 'x' };
    });

    app.controller("FirstController", function( data ) {
        data.sometest = "a";
    });
})

什么是$ scope ..?

4 个答案:

答案 0 :(得分:1)

$ scope是视图和控制器之间的粘合剂。如果你想在这些之间共享数据,你必须使用。但是你可以使用这种语法:

app.controller("FirstController", function( data ) {
        this.data.sometest = "a";
    });

但这不是最佳方案:)最佳方式是使用$ scope:

(function() {
    var app = angular.module("someawesomemodule", []);

    app.factory('data', function(){
        return { sometest: 'x' };
    });

    app.controller("FirstController", function( $scope, data ) {
        $scope.data = data;
        $scope.data.sometest = "a";
    });
})

在视图中:

<div ng-controller="FirstController">
    {{data.sometest}}
</div>

This将是思考Scope和Angular JS的良好开端。如果您开始学习AngularJS,请在阅读Angular JS页面中的教程之后阅读一些设计内容,例如this

答案 1 :(得分:1)

$ scope是一个容纳控制器数据的容器。 $ scope不能直接用于其他控制器,因此它有助于保持代码部分之间的分离。如果控制器数据已添加到$ scope中,则视图只能访问控制器数据。

var myGreatVariable;

无法观看...

$scope.myVar = myGreatVariable;

View现在可以访问变量并显示如下:

{{ myVar }}

所有注入它的控制器共享一个全局范围,名为$ rootScope。你不应该经常使用$ rootScope,因为你实际上想要为此提供服务的可能性更大。

app.controller("SomeController", function( $rootScope ) {
    $rootScope.userId = 123;
});

app.controller("SomeController", function( $scope, UserService ) {
    $scope.userId = UserService.id;
});

答案 2 :(得分:1)

什么是$ scope

$scope是您的控制器和您的视图之间的粘合剂。它保存绑定到UI /标记的数据。

您放入控制器中$scope的项目可用于您的标记,包括值和功能。

$rootScope是您的应用中通过父​​/子关系的所有范围的父级。

为什么它不起作用

你不能使用它的真正原因是Dependency Injection angular的依赖注入引擎根据字符串(参数名称)按照它们出现的顺序进行查找,这就是你的原因。请看这两个语法:

module.controller('MyCtrl', function($scope){});
module.controller('MyCtrl', ['$scope', function($scope){}]);

两者都有效,但如果你缩小/ uglify你的代码,第一个将会中断,因为$scope将被重命名,但'$scope'不会。

因此,当您将$scope更改为data时,angular不知道要传递给控制器​​的内容。

答案 3 :(得分:0)

范围在角度显影指南中描述。 https://docs.angularjs.org/guide/concepts