javascript - 在指令中使用 controllerAs 语法放置点击处理程序的位置

标签 javascript angularjs directive controlleras

在 AngularJS 中使用 controllerAs 语法时,为 ng-click 等定义处理程序的最佳位置是什么?在 Controller 上还是在作用域上(在链接函数中定义)?

那么,你使用:

angular.module('app', []).
    controller('myDirective', function(){
        return {
            template: '<div><button ng-click=vm.onClick()></button></div>',
            controller: function(){
                var vm = this;

                vm.onClick = function(){
                    vm.myValue = vm.doSomethingFancy();
                };

                this.doSomethingFancy = function(){};
            }
        }
    });

或者:

angular.module('app', []).
    controller('myDirective', function () {
        return {
            template: '<div><button ng-click=onClick()></button></div>',
            require: 'myDirecive',
            controller: function () {
                var vm = this;

                this.doSomethingFancy = function () {
                    vm.myValue = 'somethingfancy';
                };
            },
            link: function (scope, elem, attr, ctrl) {
                scope.onClick = function () {
                    ctrl.doSomethingFancy();
                }
            }
        }
    });

我实际上喜欢第二个,因为现在 Controller 只分配值,事件处理在链接函数中完成。

无论如何...让我知道您的想法。

最佳答案

并非所有一成不变的规则,但您可以使用以下内容作为指导:

关注点分离

  • 在 Controller 中修改模型数据
  • 修改指令中的DOM/UI

doSomethingFancy 是否对您的模型(在范围内)做了一些花哨的事情? -- 使用 Controller 。

doSomethingFancy 是否对用户界面做了一些花哨的事情? -- 使用链接

竞争条件

  • Controller 代码在模板编译之前执行
  • 链接函数在模板编译后执行

这不完全正确:您还可以使用 pre 链接方法。

常识

如果您通过在链接方法中放置一个简单的小函数来提高代码的可读性,请使用链接方法。过度设计,仅仅遵守一些规则并不是一件好事 :) MV* 模式是指南。

关于javascript - 在指令中使用 controllerAs 语法放置点击处理程序的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29561423/

相关文章:

javascript - AngularJS 错误加载 Controller

angularjs - ng-repeat 显示模型但不更新它

javascript - 有效地将交叉点链接到包含集

javascript - 在不禁用 Javascript 的情况下在 WebView 中禁用 HTML5

javascript - 使用 <noscript> 回退的 DRY 延迟加载图像

javascript - 当我更改 AngularJS 中另一个选择选项的值时,如何更改选择选项的值?

javascript - 显示加载叠加层,直到加载 $http get 图像

AngularJS 将 $resource 作为指令参数传递

javascript - 检测每个父元素上的滚动事件

javascript - Node.js 在错误的文件路径上崩溃