【问题标题】:AngularJS Inheritance Patterns without using scope?AngularJS继承模式不使用范围?
【发布时间】:2016-09-27 09:09:16
【问题描述】:

我是 Angular js 的新手,我正在通过各种很棒的链接学习它,其中我遇到的是 inheritance,它展示了如何在 Angular js 中获得继承,但我怀疑作者说“因为 AngularJS没有提供任何使用继承的内置特性, 在这篇博文中,我将描述如何将通用的 JavaScript 继承模式应用于 AngularJS 组件。”但是我们确实有角度继承的范围那么他的第一条语句是什么意思?我错过了一些要理解的东西吗?请解释一下。

【问题讨论】:

标签: javascript angularjs inheritance


【解决方案1】:

由于 AngularJS 不提供任何内置功能供使用 继承

这意味着 Angular 作为一个框架没有任何继承机制(代码重用),例如,主干的 extend 功能。但是,您可能仍需要从控制器或服务继承功能,因此本文将向您展示如何在 Angular 框架中使用原生 JS 来实现。

我们确实有 Angular 的继承范围

是的,作用域确实使用prototypes,但它不用于共享功能(代码重用),而是使子作用域能够在没有额外机制的情况下从父作用域访问数据

【讨论】:

  • 感谢它帮助消除了我的疑问,即范围是在子级和父级之间共享数据,但我有一个小疑问,如果我向父级范围添加一个函数,我的子控制器不会得到它,如果它难道它不能增强它以重复使用吗?
  • @Charu,是的,如果您的子范围没有被隔离,子范围也可以访问父函数。但是我不会重用在范围内定义的函数,如果您需要一个在多个地方使用的函数,如果它与业务逻辑或控制器相关,最好将它放在某个服务上,如果该函数为演示准备数据
  • Angular 确实有 angular.extend()
  • @AmyBlankenship,当然,但它不用于通过原型进行继承
【解决方案2】:

AngularJs $Scope - 在 AngularJS 中,$Scope 是被组织成层次结构的对象。有一个根作用域,根作用域有一个或多个子作用域。每个视图都有自己的 $scope(它是根范围的子范围),因此无论一个视图控制器在其 $scope 变量上设置什么变量,这些变量对其他控制器都是不可见的。

继承 - 继承使您能够创建新的类来重用、扩展和修改在其他类中定义的行为。其成员被继承的类称为基类,继承这些成员的类称为派生类。派生类只能有一个直接基类。继承是传递的。如果 ClassC 是从 ClassB 派生的,而 ClassB 是从 ClassA 派生的,则 ClassC 会继承 ClassB 和 ClassA 中声明的成员。

【讨论】:

  • 我知道这一点,但我怀疑作者所说的“由于 AngularJS 没有提供任何使用继承的内置功能, 在这篇博文中,我将描述如何将通用的 JavaScript 继承模式应用于 AngularJS 组件。”但我们确实有角度的范围那么他是什么意思?
  • scope 只是一个引用应用模型的对象,它会绑定 ng-model 的值,也可以观察表达式和事件
  • @MBalajivaishnav 我理解范围我关心的不是那个。请查看我编辑的问题和您上方的评论以了解我的疑问。
  • @Charu 你认为作用域是继承吗
  • @Charu - 请检查更新后的答案,希望这能帮助您了解 AngularJs 中的 $Scope
【解决方案3】:

Angular 是框架,JavaScript 是编程语言,继承是语言特性而不是框架特性。所以从 - 如何在 JavaScript 中进行继承开始,它可以在 angular(或任何其他框架)中使用,它只是在 javascript 中创建的库。

一些框架在 Backbone 中创建了类似 extend 的方法,但 extend 是在纯 js 中进行基于原型的继承的方法。这不是魔术。同样的事情可以在服务、范围等的角度变量中完成。

【讨论】:

    【解决方案4】:

    另一个在 Angular 中常用的涉及继承的设计范式在于创建服务。可以创建一个服务,我们称之为 BaseService,像这样..

    this.publicVar = '..'
    
    this.method1 = function() .. 
    
    this.method2 = function() ..
    
    var privateMethod = function() ..
    
    var privateVar = '...';
    
    return this;
    
    and then in another service, inject the BaseService, and then begin by doing
    
    this = Object.create(BaseService);
    
    then you can extend the BaseService in this new service with other methods
    
    this.newServiceMethod = function() ...
    

    【讨论】:

      猜你喜欢
      • 2015-02-04
      • 1970-01-01
      • 1970-01-01
      • 2014-05-20
      • 2015-07-19
      • 1970-01-01
      • 1970-01-01
      • 2013-08-13
      • 1970-01-01
      相关资源
      最近更新 更多