我是否滥用过多逻辑的指令?

时间:2014-12-30 22:08:17

标签: angularjs

我们说我从factory获取一个对象列表,然后将其传递给controller,并从那里将其呈现在directive ...到目前为止这是最好的做法,对吗?

同样假设每个对象都有save()函数,如果我的指令如下:

.directive('Foo', function($modal) {
    return {
        restrict: 'EA',
        require: 'ngModel',
        transclude: true,
        templateUrl: 'admin/foo.html',
        scope: {
            model: '=ngModel',
            save: '&'
        },
        controller: function($scope) {
            $scope.$watch('model', function(newVal, oldVal) {
                init()
            });
            function init(){
              // do some loops
            };
            $scope.doThis(){
             // click event
            }
           $scope.checkThat(){
             // some array methods
            }
           $scope.proxySave(){
             // call passed in fn();
             $scope.save({})
            }
        },
        link: function(scope, element, attr, ngModel) {
          // not really doing much here
        }

从指令html开始,将会有一些定义为doThis()的ng-click函数。

从关注点分离的角度来看,我认为它可以保留我的主控制器,但我在指令代码中并没有真正做很多DOM操作,除了链接到模板HTML和一大堆逻辑指令控制器。我的一些指令控制器大约有100行逻辑。

是因为我滥用ng-if来显示/隐藏?我应该使用链接功能吗?

1 个答案:

答案 0 :(得分:5)

可能你的问题可能更像是表达意见,而不是提供正确的解决方案"。

如果指令没有公开可由其他指令(require: "^myDirective")使用的逻辑,我个人不会将控制器引入指令。所以我的大多数指令都有你在link: function (scope, element, attrs) {}中放入控制器的代码。

但是如果有许多代码行与DOM操作无关,那么很可能它们包含一些非UI相关的业务逻辑,这些逻辑可以转移到服务中。有更好的重用机会和更清晰的关注点分离。

<强> TL; DR

  • 所有$scope.foo = function () { ... }也可以住在link: function (...) {...}
  • 如果您需要控制器将某些API公开给其他指令,请添加控制器:this.bar = function ()
  • 尽可能多地将逻辑放入服务中。或者为模型添加逻辑(这在AngularJS应用程序中经常出现,但我认为没问题)

正如我已经说过的那样:这只是我的意见......

编辑我的意思是&#34;为您的模型添加逻辑&#34;?

JavaScript不仅是一种函数式编程语言,也可以用于面向对象。当然没有&#34;类&#34;,但是使用原型继承或ECMAScript 5功能(如getter和setter),可以创建一个外观和行为类似于Java或其他OOP语言的对象模型。 / p>

通常有非常小的业务逻辑&#34;片段&#34;,可以放到控制器,服务,过滤器或指令中。我不会将对象连接到大图并将所有逻辑(例如持久性逻辑)放到业务对象中。但是这些小的逻辑片段最好位于模型数据中,例如:

isExternal()
grossPrice
calculateFields()
roundToMinutes()

这给了我安全性,这种逻辑始终存在于&#34; raw&#34;数据和重复代码的风险较小。而且我不必总是将数据与正确的服务连接起来,并在视图中需要时在控制器或指令中公开这些服务。

编辑回答&#34;我滥用ng-if来显示/隐藏?&#34;

复杂UI必须显示/隐藏很多,具体取决于应用程序及其数据的状态。因此,在实际应用程序(不仅仅是小例子)中,有很多ng-ifng-show / ng-hideng-switch。看起来总是不错,但替代方案是什么? (如果您使用ng-ifng-if-start,有时可以保存几个ng-if-end,请参阅Multi-Element Directives)。