AngularJS是否使用$scope是实际的呢?

18 浏览
0 Comments

AngularJS是否使用$scope是实际的呢?

在访问控制器函数方面,有两种模式可供使用:this$scope

我应该使用哪个,什么时候使用?我知道this被设置为控制器,而$scope是视图范围链中的对象。但是使用新的"Controller as Var"语法,你可以轻松地使用任何一种。所以我想问的是什么是最好的,未来的方向是什么?

例如:

  1. 使用this

    function UserCtrl() {
      this.bye = function() { alert('....'); };
    }
    

    
      
    

  2. 使用$scope

    function UserCtrl($scope) {
        $scope.bye = function () { alert('....'); };
    }
    

    
        
    

我个人认为this.name对眼睛更友好,与其他JavaScript面向对象模式相比更自然。

请给予建议。

0
0 Comments

AngularJS中使用$scope是否实用?

$scope是“经典”技术,而“controller as”则是最近更多的技术。两者都能很好地工作,唯一的错误答案就是在同一个应用程序中混合使用它们而没有明确的原因。混合使用它们会增加混乱,因此选择一个并坚持下去是最重要的事情。

选择哪一个取决于你自己。有更多的$scope的例子,但是“controller as”也开始流行起来。哪一个更好?这是有争议的。那么你如何选择呢?

我更喜欢“controller as”,因为我喜欢隐藏$scope,并通过一个中介对象将控制器的成员暴露给视图。通过设置this.*,我可以从控制器向视图暴露我想要的内容。你也可以使用$scope做到这一点,但我更喜欢使用标准的JavaScript。事实上,我会这样编码:

var vm = this;

vm.title = 'some title';

vm.saveData = function(){ ... } ;

return vm;

这样做对我来说更清晰,并且易于看出向视图暴露了什么。请注意,我将返回的变量命名为“vm”,表示视图模型(ViewModel)。这只是我的约定。

使用$scope我也可以做同样的事情,所以我在技术上没有增加或减少。

$scope.title = 'some title';

$scope.saveData = function() { ... };

所以这取决于你。

对于$scope,我需要将$scope注入到控制器中。对于controller as,我不需要这样做,除非我出于其他原因需要它(比如$broadcast或watch,虽然我尽量避免在控制器中使用watch)。

关于这两个选择,我写了这篇文章:

http://www.johnpapa.net/do-you-like-your-angular-controllers-with-or-without-sugar/

我个人也使用vm这种方式。我发现当你需要与$scope进行特定的交互时(比如订阅或广播事件,在控制器中访问表单验证变量等),会有一种混合的环境,即使你使用控制器功能也需要注入$scope。

是的,$scope在这种情况下仍然被使用,但它更多地被用作一个服务。当我们注入angular服务($scope,$q等)时,它们提供了一些我们需要的功能。$scope允许我们进行监视、应用、使用消息以及数据绑定。即使使用controller as,$scope仍然被使用,只是被抽象化了。

谢谢John,这也是我的结论。

我认为在指令中使用$scope并自动在DOM树中继承是关于$scope的重要点。具有这种继承的好处是一个好主意,我不知道。它就像一个全局对象,可能会导致意想不到的错误。$scope应该有更好的文档。

var vm = this;在视图中你需要将它命名为'vm'吗?'controller as vm'。它们必须是相同的吗?

控制器和视图中的vm不必是相同的名称。我只是根据约定这样做,因为这样更容易保持一致,而且它输入更短,并且vm表示它是视图模型(ViewModel)。当然,如果你对其他名称感兴趣,你可以偏离这个约定。

谢谢。我在Pluralsight上观看你的课程。我从你那里学到了很多。

- 在使用Controller As时,为什么SideWaffle模板不返回vm?

控制器实际上充当了构造函数,因此已经返回了“this”。

我看到这个答案是在2013年。我正在完成我的新应用程序的最后阶段,我从未使用过controllerAs。我在整个应用程序中都使用了$scope,我从未遇到过重叠范围的问题。现在我看到越来越多的人使用(或建议)this而不是scope,我在是否应该花时间将所有内容从$scope重写为this的困境中。因此,截至今天,考虑到Angular的未来,您是否仍然建议“选择一种并坚持下去。最重要的是保持一致。”?

如果你的应用程序正常工作,我会非常谨慎地重新编写它。毕竟,它能正常工作。因此,在改变生产应用程序中的代码时,风险必须超过奖励。ControllerAs将帮助你为Angular 2做好心理准备,但你仍然需要改变代码才能达到这个目标,或者使用ngUpgrade。所以不……根据你所说的,我不会改变现有的工作应用程序。但是,你可以在进行应用程序更改时逐渐开始这样做,每次只改变1个视图和控制器。

正如jason328所说,“$scope正在Angular 2.0中被移除”。如果是这样,那么在我的使用了$broadcast和$on的控制器中,我应该使用什么代替$scope?

在ng2中,你可以使用EventEmitter构造来代替。

为什么称之为vm?我们还定义了控制器函数,所以它不仅仅是数据模型。我感到困惑。

vm == ViewModel == 视图模型

我在使用类似的答案时遇到了一些问题,请参阅stackoverflow.com/questions/38315538。

引用“控制器和视图中的vm不必是相同的名称。我只是这样做。”所以你在视图中写ng-controller="controller as vm",这也是你在你的出色的代码风格指南中使用的方式(github.com/johnpapa/angular-styleguide/blob/master/a1/README.md)。为什么?如果你在视图中将所有的控制器命名为vm,那么你可能根本不需要使用controllerAs语法。

只是想提一下,当使用bootstrap标签页时,你会发现使用var vm = this比使用$scope更合理。标签页有它们自己的作用域,所以你不能像你想象的那样使用$scope,但你可以在任何地方使用vm。所以它确实有一定的功能原因,而不仅仅是约定。

0
0 Comments

AngularJS中是否实用$scope?

在这段内容中,某些情况下了JavaScript中的‘this’存在的问题,认为在其上再添加另外的含义/用途是一个不好的主意。为了清晰起见,他们会使用$scope。

但是,现在有了“controller as”语法,可以在这里讨论。尽管我不是一个支持者,但是既然它是一个更“官方”的AngularJS构造,它值得一些关注。

我认为我们首先需要了解新的“UserCtrl as uCtrl”语法,然后再说哪种方式更好。

关于“UserCtrl as uCtrl”,我同意,这需要被理解。我认为这是一个糟糕的主意,原因和这里提出的论点大致相同。

如果你熟悉JS中的面向对象编程,这是非常合理的。一个控制器是一个类,每次创建一个控制器时AngularJS都会使用new运算符。你可以不喜欢它,但是声称使用‘this’会有问题是误导性的。这是‘this’的一个合理用例。

$scope在清晰度方面没有任何帮助。实际上,当使用$scope并且有嵌套作用域时,在视图中很难知道发生了什么。使用控制器 as语法以及使用‘this’可以提供更多的清晰度。在视图中,可以清楚地知道哪个控制器的作用域是某个方法或属性的来源。

我在类似实现你的回答时遇到了一些问题,请参考stackoverflow.com/questions/38315538

我同意。刚刚遇到了一个使用bootstrap标签和带有var vm =$scope的angular的问题。标签有它们自己的作用域,所以不能像预期的那样使用this,但是使用var vm = this,一切都按预期工作。

0
0 Comments

AngularJS is it practical to use $scope?

$scope is being removed in Angular 2.0. Thus, using this would be an approach others want to follow as the date of release of Angular 2.0 comes closer.

0