javascript - 在指令之间共享公共(public)代码

标签 javascript angularjs

我正在研究一个 Angular 项目的核心,为了跨多个组件重用,我想尽可能地保持行为分离。一个示例可能是使用“iScroll”库来下拉刷新某些内容。目前,我遇到了问题,因为其中许多行为都需要它们自己的范围。我认为也许将行为包装在服务中可能是可行的方法,但我还没有真正看到过这种事情的很多例子。所以我想知道这是否是正确的方法。这是一个非常非常简单的 jsfiddle 示例:

http://jsfiddle.net/S7kC7/

var controls = angular.module('controls', []);
controls.service('ScrollingBehavior', function () {
    this.link = function ($scope, $element) {
        $element.addClass('scrolling');
    }
});

controls.directive('scrolling', ['ScrollingBehavior', function (ScrollingBehavior) {
    //pretend that this has its own individual scope
    return {
        restrict: 'A',
        link: function ($scope, $element) {
            console.log("Linking scrolling");
            ScrollingBehavior.link($scope, $element);
        }
    }
}]);

controls.directive('panel', ['ScrollingBehavior', function (ScrollingBehavior) {
    return {
        restrict: 'E',
        transclude: true,
        replace: true,
        template: '<div ng-transclude></div>',
        //pretend that this has its own individual scope
        link: function ($scope, $element) {
            console.log("Linking panel");
            ScrollingBehavior.link($scope, $element);
        }
    }
}]);

我的想法是公开某些预期的方法(即“链接”、“ Controller ”),这些方法可以在需要这些行为或功能的其他指令中使用。由于作用域是一个对象并通过引用传递,因此它可以 Hook ,就像刚刚复制/粘贴代码一样。

这样做有问题吗?服务是否可以被视为服务于某种“混入”的东西?再一次,我只是问,因为我还没有真正看到任何这样的例子。

[注意:我不确定,但也许这属于代码审查网站?]

最佳答案

我认为执行此操作的“Angular ”方法是创建一个 scrollingBehavior 指令并将其附加到您的其他指令,必要时进行嵌套。

[编辑] 更新了带有独立作用域的 jsfiddle 和示例代码。

http://jsfiddle.net/8dYYk/

<div scrolling-with-scrolling-behavior>This should have a scroll bar</div>
<div scrolling><div scrolling-behavior>This should have a scroll bar</div></div>
<panel scrolling-behavior>This should also have a scroll bar</panel>


controls.directive('scrollingBehavior', function () {
    return {
        restrict: 'A',
        scope: { 'behavior': '=' },
        link: function ($scope, $element) {
            $element.addClass('scrolling');
        }
    }
});

controls.directive('scrolling', function () {
    //pretend that this has its own individual scope
    return {
        restrict: 'AE',
        scope: { 'otherThing': '=' },
        link: function ($scope, $element) {
            console.log("Linking scrolling");
        }
    }
});

controls.directive('scrollingWithScrollingBehavior', function () {
    return {
        restrict: 'A',
        transclude: true,
        scope: { 'behavior': '=' },
        template: '<div scrolling-behavior><div scrolling ng-transclude></div><div>'
    }
});

关于javascript - 在指令之间共享公共(public)代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21790678/

相关文章:

javascript - ES6 函数在解构对象时无权访问 `this`

javascript - 音乐播放器 "easy"Div prob

angularjs - Angular js 输入类型文件 - 清除以前选择的文件

javascript - Angular-jQuery : Putting jQuery in a separate file and getting error 'Cannot read property ' top' of undefined'

javascript - 在javascript中播放音频文件

javascript下拉验证

node.js - 连续 "hot"部署有 Angular 的 Web 应用程序

javascript - 如何使用 Angular $http 将数据 POST 到 PHP

javascript - 选择值后变得不确定

angularjs - 在ag-grid中添加/删除行