在 “Create Components” section of AngularJS’s homepage,有这个例子:
controller: function($scope,$element) {
  var panes = $scope.panes = [];
  $scope.select = function(pane) {
    angular.forEach(panes,function(pane) {
      pane.selected = false;
    });
    pane.selected = true;
  }
  this.addPane = function(pane) {
    if (panes.length == 0) $scope.select(pane);
    panes.push(pane);
  }
}

注意如何将select方法添加到$ scope,但addPane方法添加到此。如果我将其更改为$ scope.addPane,代码断开。

文档说,事实上有一个区别,但它没有提到什么区别是:

PrevIoUs versions of Angular (pre 1.0 RC) allowed you to use this interchangeably with the $scope method,but this is no longer the case. Inside of methods defined on the scope this and $scope are interchangeable (angular sets this to $scope),but not otherwise inside your controller constructor.

这和$ scope如何工作在AngularJS控制器?

“How does this and $scope work in AngularJS controllers?”

简短答案:

>这个

>当调用控制器构造函数时,这是控制器。
>当调用在$ scope对象上定义的函数时,这是“调用函数时有效的范围”。这可能(或可能不是!)是函数定义的$范围。所以,在函数内部,这个和$ scope可能不一样。

> $ scope

>每个控制器都有一个关联的$ scope对象。
>控制器(构造函数)函数负责在其相关联的$ scope上设置模型属性和函数/行为。
>只有在此$ scope对象(以及父范围对象,如果原型继承正在运行)中定义的方法可以从HTML /视图访问。例如,从ng-click,过滤器等

长答案:

控制器函数是JavaScript构造函数。当构造函数执行时(例如,当视图加载时),这个(即“函数上下文”)被设置为控制器对象。所以在“tabs”控制器构造函数中,当addPane函数被创建时

this.addPane = function(pane) { ... }

它是在控制器对象上创建的,而不是在$ scope上。视图看不到addPane函数 – 它们只能访问在$ scope上定义的函数。换句话说,在HTML中,这将不工作:

<a ng-click="addPane(newPane)">won't work</a>

在“tabs”控制器构造函数执行后,我们有以下:

虚线黑色线表示原型继承 – 孤立范围从原型继承自Scope.(它不从原型继承自HTML中遇到指令的有效范围。)

现在,pane指令的链接函数想要与tabs指令通信(这真的意味着它需要影响标签以某种方式隔离$ scope)。可以使用事件,但另一种机制是让pane指令需要tabs控制器。 (似乎没有机制让窗格指令要求标签$ scope。)

所以,这提出了一个问题:如果我们只有访问tabs控制器,我们如何访问的选项卡隔离$ scope(这是我们真正想要的)?

嗯,红色的虚线是答案。 addPane()函数的“scope”(我指的是JavaScript的函数作用域/ closures这里)给了函数访问tabs $ scope。也就是说,addPane()可以访问上图中的“tabs IsolateScope”,因为定义了addPane()时创建了一个闭包。 (如果我们在tabs $ scope对象上定义addPane(),则pane指令将无法访问此函数,因此它将无法与tabs $ scope进行通信)。

回答你的问题的另一部分:$ scope如何在控制器工作:?

在$ scope上定义的函数中,这被设置为“$ scope在效果中/当函数被调用时”。假设我们有以下HTML:

<div ng-controller="ParentCtrl">
   <a ng-click="logThisAndScope()">log "this" and $scope</a> - parent scope
   <div ng-controller="ChildCtrl">
      <a ng-click="logThisAndScope()">log "this" and $scope</a> - child scope
   </div>
</div>

和ParentCtrl(Solely)有

$scope.logThisAndScope = function() {
    console.log(this,$scope)
}

单击第一个链接将显示此和$ scope是相同的,因为“函数调用时有效的范围”是与ParentCtrl相关联的范围。

点击第二个链接会显示这个和$ scope不一样,因为“函数调用时有效的范围”是与ChildCtrl相关联的范围。所以这里,这是设置为ChildCtrl的$ scope。在方法内部,$ scope仍然是ParentCtrl的$ scope。

Fiddle

我试图不使用在$ scope定义的函数内部,因为它变得混淆哪个$ scope正在受到影响,特别是考虑到ng-repeat,ng-include,ng-switch和directives都可以创建自己的子范围。

‘this’ vs $scope在AngularJS控制器的更多相关文章

  1. Xcode C开发,需要澄清

    我非常喜欢Xcode提供对该语言可能的成员函数的深入了解的方式,并且更喜欢相对于文本伙伴使用它,如果不是因为我今天注意到的奇怪.当strings=“Teststring”时;唯一可用的substr签名如图所示但据我所知,签名应该是什么iseeonline确实s.substr(1,2);既被理解也适用于Xcode.当我尝试方法完成时为什么不显示?

  2. xamarin.ios – 没有找到ViewController ::.ctor(System.IntPtr)的构造函数

    我有一个问题,我的Monotouch应用程序有时在收到内存警告后才会崩溃.请参见下面的堆栈跟踪.堆栈跟踪是正确的,因为指定的类缺少构造函数获取IntPtr参数.但是这是有意的,因为我在应用程序中根本不使用InterfaceBuilder.那为什么会这样呢?

  3. ios – Swift – NSURL错误

    尝试使用下面的NSURL类时出错,下面的代码实际上是试图将我从Facebook拉入的图像存储到imageView中.错误如下:不知道为什么会这样,帮忙!解决方法你正在调用的NSURL构造函数有这个签名:?表示构造函数可能不返回值,因此它被视为可选.NSData构造函数也是如此:快速解决方法是:最好的解决方案是检查(解包)这些选项,即使您确定它们包含值!

  4. 如何在Xcode中追踪“libc abi.dylib:纯虚函数!”

    我有一个多线程OSX应用程序,它使用C,Objective-C和Swift的混合.当我的应用程序关闭时,我在Xcode调试器窗口中看到了这一点:我知道这个错误通常是由对C类构造函数或析构函数中的虚函数的调用引起的.有没有一种简单的方法可以找到它的位置?

  5. Swift实现对象归档

    Swift实现对象归档时有几个注意点要继承NSCoding,实现两个方法extension是一个分类,分类不允许有存储能力,所以协议方法不能写在分类中协议中的init(coderdecoder:NSCoder)函数会覆盖原始的构造函数,所以类中至少还要有另一个init方法如果不指定键名,会使用属性名称作为key,基本数据类型,需要指定key

  6. 【Swift初见】Swift构造过程

    构造过程是通过构造器来实现的,其实每个构造器就可以看作是一个函数,只是这个函数是为了执行初始化的。每个类都必须拥有一个指定构造器。

  7. swift的struct结构体类型介绍使用

  8. swift struct

    //:Playground-noun:aplacewherepeoplecanplayimportCocoavarstr="Hello,playground"structpoint{varx=0;vary=init(x:Int,y:Int){self.x=x;y=y;println("init");}funcgetCenter()->Int{return(x+y)/2;}mutatingfunca

  9. 《The Swift Programming Language》2.0版之自动引用计数

    Swift1.0文档翻译:TimothyYeSwift1.0文档校对:HawsteinSwift2.0文档校对及翻译润色:ChannePS:之前1.0版中文版看不懂地方在对比英文版后就懂了,还是之前翻译的不够准确啊。,而不是Person),它们的值会被自动初始化为nil,目前还不会引用到Person类的实例。由于Person类的新实例被赋值给了reference1变量,所以reference1到Person类的新实例之间建立了一个强引用。在你将john和number73赋值为nil后,强引用关系如下图:P

  10. swift #6 类

随机推荐

  1. Angular2 innerHtml删除样式

    我正在使用innerHtml并在我的cms中设置html,响应似乎没问题,如果我这样打印:{{poi.content}}它给了我正确的内容:``但是当我使用[innerHtml]=“poi.content”时,它会给我这个html:当我使用[innerHtml]时,有谁知道为什么它会剥离我的样式Angular2清理动态添加的HTML,样式,……

  2. 为Angular根组件/模块指定@Input()参数

    我有3个根组件,由根AppModule引导.你如何为其中一个组件指定@input()参数?也不由AppModalComponent获取:它是未定义的.据我所知,你不能将@input()传递给bootstraped组件.但您可以使用其他方法来做到这一点–将值作为属性传递.index.html:app.component.ts:

  3. angular-ui-bootstrap – 如何为angular ui-bootstrap tabs指令指定href参数

    我正在使用角度ui-bootstrap库,但我不知道如何为每个选项卡指定自定义href.在角度ui-bootstrap文档中,指定了一个可选参数select(),但我不知道如何使用它来自定义每个选项卡的链接另一种重新定义问题的方法是如何使用带有角度ui-bootstrap选项卡的路由我希望现在还不算太晚,但我今天遇到了同样的问题.你可以通过以下方式实现:1)在控制器中定义选项卡href:2)声明一个函数来改变控制器中的散列:3)使用以下标记:我不确定这是否是最好的方法,我很乐意听取别人的意见.

  4. 离子框架 – 标签内部的ng-click不起作用

    >为什么标签标签内的按钮不起作用?>但是标签外的按钮(登陆)工作正常,为什么?>请帮我解决这个问题.我需要在点击时做出回复按钮workingdemo解决方案就是不要为物品使用标签.而只是使用divHTML

  5. Angular 2:将值传递给路由数据解析

    我正在尝试编写一个DataResolver服务,允许Angular2路由器在初始化组件之前预加载数据.解析器需要调用不同的API端点来获取适合于正在加载的路由的数据.我正在构建一个通用解析器,而不是为我的许多组件中的每个组件设置一个解析器.因此,我想在路由定义中传递指向正确端点的自定义输入.例如,考虑以下路线:app.routes.ts在第一个实例中,解析器需要调用/path/to/resourc

  6. angularjs – 解释ngModel管道,解析器,格式化程序,viewChangeListeners和$watchers的顺序

    换句话说:如果在模型更新之前触发了“ng-change”,我可以理解,但是我很难理解在更新模型之后以及在完成填充更改之前触发函数绑定属性.如果您读到这里:祝贺并感谢您的耐心等待!

  7. 角度5模板形式检测形式有效性状态的变化

    为了拥有一个可以监听其包含的表单的有效性状态的变化的组件并执行某些组件的方法,是reactiveforms的方法吗?

  8. Angular 2 CSV文件下载

    我在springboot应用程序中有我的后端,从那里我返回一个.csv文件WheniamhittingtheURLinbrowsercsvfileisgettingdownloaded.现在我试图从我的角度2应用程序中点击此URL,代码是这样的:零件:服务:我正在下载文件,但它像ActuallyitshouldbeBook.csv请指导我缺少的东西.有一种解决方法,但您需要创建一个页面上的元

  9. angularjs – Angular UI-Grid:过滤后如何获取总项数

    提前致谢:)你应该避免使用jQuery并与API进行交互.首先需要在网格创建事件中保存对API的引用.您应该已经知道总行数.您可以使用以下命令获取可见/已过滤行数:要么您可以使用以下命令获取所选行的数量:

  10. angularjs – 迁移gulp进程以包含typescript

    或者我应该使用tsc作为我的主要构建工具,让它解决依赖关系,创建映射文件并制作捆绑包?

返回
顶部