Angular $ Scope服务:它是如何工作的?

时间:2013-08-17 16:45:07

标签: javascript angularjs frameworks scope

我一直在试验Angular几周,并且有点担心我不理解$ scope服务所使用的魔力。我已成功编写使用$ scope服务来更新模型/视图的控制器,并且我已经能够编写自己的指令来执行相同的操作。

太神奇了!我只是不知道$ scope服务引擎盖下发生的事情。当我创建类似下面的内容时,当我对$ scope.newproperty进行赋值时实际发生了什么?我找不到任何特定于$ scope服务的文档。

module.controller("menu_ctrl",['$scope','$http',function($scope,$http){
    $scope.newproperty = "Bound to model!" //magic!
}]);

此外,当我在一个指令(下面的例子)中创建一个新的链接函数时,我怎么能突然用变量访问作用域呢?我假设使用$ scope或$ apply服务有一些魔力,但我只是猜测。这里的任何帮助将不胜感激。谢谢!

srvcs.directive('directiv', ['$http',function($http) {
   var returnObj = {
   link: function linkfn(scopeVar, instance, attr){
      console.log(scopeVar);
      scopeVar.newproperty = "Also bound to model!" //more magic!
      ...
      ...
      }
   };
   return returnObj;
 }]);

1 个答案:

答案 0 :(得分:5)

$scope本身不是服务 ;它只是应用程序根范围的子范围。所以你应该查看$rootScope service文档。

从技术上讲,范围是一个原型继承自$rootScope的对象,它是使用$new方法创建的。由于它是一个对象,您只需通过执行$scope.property = value;就可以在其上创建新属性。引擎盖下没有吸气剂/固定剂方法。要更好地理解它,您应该在Angular源代码中查找function $RootScopeProvider()

由于范围只是一个对象,您可以在指令中的link函数中访问它,就像在控制器中一样。不需要魔法。 :)

关于$apply,它也不是服务,而是$rootScope服务的方法。它只是触发一个摘要周期,以便Angular处理当前范围的观察者及其子女。

最后,您可能有兴趣查看understanding Angular scopes上的这篇文章,以防您还没有。 :)