0

我只是想检查这个功能是否可以在angularjs中使用。例如:我有一些常用函数的base指令,但是在我的整个应用程序中,所有的指令都需要实现这些函数,以便发生更多的代码重复,我期待Java中的扩展(继承)具有相同的功能。将基本指令功能扩展到其他指令

是否有可能在angularjs中实现此功能?

根据我的要求,我不能通过将此代码移动到服务或工厂来存档此功能,因为它像应用程序中的所有指令都需要在链接上执行此操作,所以现在我所有的指令链接功能容器与重复代码相同的功能。

我期待的是为我的所有指令扩展基本指令功能。

[注意] 我的应用程序中的大多数指令都有独立的范围。

回答

1

答案主要在于JS域,寻找可重用代码的模式是一个很好的挑战。 Angular得到了extend,copymerge,但就这些,模块和DI只是解决ES5限制的方法。

下面是关于如何从指令定义对象创建混合的提示。

app.directive('blockBase', function() { 
    return { 
     link: function (scope, element, attrs) { 
      scope.title = 'block'; 
     } 
    }; 
}); 

app.directive('brickBase', function() { 
    return { 
     restrict: 'E', 
     scope: true, 
     link: function (scope, element, attrs) { 
      // ... 
     } 
    }; 
}); 

app.directive('block', function (blockBaseDirective, brickBaseDirective) { 
    var blockDirective = angular.extend(brickBaseDirective[0], { 
     name: 'brick', 
     restrict: 'EA', 
     scope: { 
      title: '=' 
     } 
    }); 

    blockDirective.compile = function (element, attrs) { 
     // ... 
     return { 
      post: function (scope, element, attrs) { 
       blockBaseDirective[0].link(scope, element, attrs); 
       scope.title += ' offspring'; 
      } 
     }; 
    }; 

    return blockDirective; 
}); 

你应该自己决定,如果这种方法看起来比装饰者更好。

在控制器/指令定义之外使用命名函数是摆脱重复代码的流行方式,而不是优雅的代码。当然,您可以通过自定义DDO属性在指令之间共享函数或类。但是,工厂仍然更适合。

+0

你如何得到这个工作?当我尝试这个时,我得到'未知的提供者'错误,似乎是当试图注入一个指令到另一个指令时......这甚至可能吗? – 2016-01-14 21:56:34

+1

@JaredHales是的,这是可能的,Angular寄存器的'directiveName'指令为'directiveNameDirective'服务。它是否被注入到其他指令或其他地方并不重要。如果您在代码方面有问题,请随时发布问题。 – estus 2016-01-14 22:52:45