Angular-styleguide: $scope.watch 以控制器为语法

创建于 2015-07-17  ·  12评论  ·  资料来源: johnpapa/angular-styleguide

在您使用控制器作为语法( Style Y032 )观看的示例中,您没有明确说明您将控制器与其视图耦合,因为您的代码段仅在您的视图中有SomeController as vm时才有效。

对我来说,这是使用整个控制器作为语法的缺点。 你可以使用 $scope.watch 的函数符号来解决这个问题,或者使用你当前的方法写一些关于问题的东西。

Angular 1 enhancement help wanted

最有用的评论

我认为这总结了讨论


控制器作为 $watch

[样式[Y999](#style-y999)]
  • 避免使用 $scope.$watch。 改用 ng-change 或自定义指令。

    _Why?_:手表更难测试,而且它们对性能也不利,因为它们在每个 $digest 循环中进行评估。

    /* avoid */
    function SomeController($scope) {
    var vm = this;
    
    $scope.$watch(function () {
        return vm.title;
    }, doSomething);
    
    function doSomething() {
    }
    }
    
    <!-- recommended -->
    <input type="text" ng-model="vm.title" ng-change="vm.doSomething()"/>
    
    /* recommended */
    function SomeController() {
      var vm = this;
      vm.doSomething = doSomething;
    
      function doSomething() {
      }
    }
    

所有12条评论

PR如果你喜欢

那么你认为我应该使用controller as$scope.$watch来写问题,还是应该引入像这样的函数符号

$scope.$watch(function () {
    return vm.title;
}, function(current, original) {
    $log.info('vm.title was %s', original);
    $log.info('vm.title is now %s', current);
});

替换旧示例还是应该比较两者?

如果我理解你的结构,我会比较两者并使用你的避免和推荐的语法。

呜呜呜。 在控制器内部观察反模式。 在这个例子中你真的不需要它; 最好添加更改事件绑定(我相信这就是您在 Ng2 中要做的事情)。

我更希望这个讨论成为“ControllerAs”的一个子部分,它首先敦促人们避免在控制器内部观看。 然后,“如果你必须”,我只会使用@Jandalf版本,并且不会对评估 'vm.title' 表达式的风险做出太大的处理。 只需说:“这样做”。

你怎么看这个预览:

controllerAs 和 $watch

[样式Y999 ] // 下一个空闲号码是多少?

注意:创建监视时要谨慎,因为它们会为摘要循环增加更多负载。 请改用ngChange

  • 使用$scope.$watch的函数符号来观察变化

_Why?_:控制器可以绑定到另一个值然后vm

因此,如果您确实需要观看值,请使用以下模式:

  <input ng-model="vm.title"/>
  function SomeController($scope, $log) {
      var vm = this;

      $scope.$watch(function () {
          return vm.title;
      }, function(current, original) {
          $log.info('vm.title was %s', original);
          $log.info('vm.title is now %s', current);
      });
  }

嗯嗯

必须明确的是,应该避免在控制器中观看。 改用 ngChange。 或将手表移至指令。 想法?

然后是关于如何将 watch 与 controllerAs 一起使用的新规则,它会替换或更新我在那里的内容。

同意你的看法,约翰。

应该避免在控制器中使用 watch 并且首选监听更改事件或编写指令还不够清楚。 这个建议也应该有一个“为什么”(为什么控制器中的手表不好)

关于如何做的建议_如果你必须_应该是单独的点,并且应该从重复的强烈警告开始。

然后我想看看我为什么要这样做的案例。 我在这里没有看到。 实在想不出一个。 你是否可以?

如果没有这样的例子,我根本不愿意包含这个建议。

此外,本文中的“为什么”让我感到困惑。 这是避免依赖“vm”名称的特定技术的“为什么”。 这是真正原因的次要原因,这就是为什么你会在控制器中观看。 只有在前面有“不要这样做”的例子时才有意义。

需要做更多的工作,但我认为是必要的。

建议任何人?

我认为这总结了讨论


控制器作为 $watch

[样式[Y999](#style-y999)]
  • 避免使用 $scope.$watch。 改用 ng-change 或自定义指令。

    _Why?_:手表更难测试,而且它们对性能也不利,因为它们在每个 $digest 循环中进行评估。

    /* avoid */
    function SomeController($scope) {
    var vm = this;
    
    $scope.$watch(function () {
        return vm.title;
    }, doSomething);
    
    function doSomething() {
    }
    }
    
    <!-- recommended -->
    <input type="text" ng-model="vm.title" ng-change="vm.doSomething()"/>
    
    /* recommended */
    function SomeController() {
      var vm = this;
      vm.doSomething = doSomething;
    
      function doSomething() {
      }
    }
    

您是否使用 controllerAs 记录指令中的 $watch? 你能推荐一个链接或资源吗?

有人有兴趣做 PR 吗?

清理我的旧问题

此页面是否有帮助?
0 / 5 - 0 等级