我可以链接角度指令吗?

时间:2014-05-21 11:33:00

标签: javascript angularjs angularjs-directive

所以我有一个删除东西的按钮。

我已经创建了一个'confirm delete'指令,它只是打开一个带有确认消息的$ modal并且我有一个先前创建的'loading spinner'指令,该指令显示一个微调器,直到一个promise被解决/拒绝。

有没有办法在不创建新指令的情况下组合/链接这些指令?

我想触发confirm指令,然后在truthy结果中,提交加载微调器指令。

提前致谢!

ConfirmDelete:

var ConfirmDeleteDirective = (function () {
    function ConfirmDeleteDirective($parse, $modal) {
        var _this = this;
        this.$parse = $parse;
        this.$modal = $modal;
        this.restrict = "A";
        this.link = function (scope, element, attrs) {
            var func = _this.$parse(attrs["confirmDelete"]);

            element.on("click", function (evt) {
                var mInstance = _this.$modal.open({
                    backdrop: "static",
                    templateUrl: "confirmDelete.html"
                });

                mInstance.result.then(function () {
                    if (func) {
                        func.apply(element);
                    }
                }, function () {
                    //do nothing!
                });
            });
        };
    }
    return ConfirmDeleteDirective;
})();

LoadingSpinner:

var LoadingSpinnerDirective = (function () {
function LoadingSpinnerDirective($parse) {
    var _this = this;
    this.$parse = $parse;
    this.restrict = "A";
    this.link = function (scope, element, attrs) {
        if (attrs["targetElement"]) {
            var targetElement = angular.element("#" + attrs["targetElement"]);
            if (targetElement.length > 0) {
                element = targetElement;
            }
        }

        var fn = _this.$parse(attrs["loadingSpinner"]), target = element[0], eventName = attrs["eventName"] || "click", opts = {
            lines: 11,
            length: 9,
            width: 2,
            radius: 4,
            corners: 1,
            rotate: 0,
            direction: 1,
            color: "#fff",
            speed: 1.3,
            trail: 60,
            shadow: false,
            hwaccel: false,
            className: "spinner",
            zIndex: 2e9,
            top: attrs["spinner-top"] || "50%",
            left: attrs["spinner-left"] || "50%"
        };

        // implement our click handler
        element.on(eventName, function (event) {
            scope.$apply(function () {
                element.prop("disabled", true);
                element.css("position", "relative");
                var spinner = new Spinner(opts).spin(target);

                // expects a promise
                // http://docs.angularjs.org/api/ng.$q
                fn(scope).then(function (res) {
                    element.prop('disabled', false);
                    spinner.stop();
                    return res;
                }).catch(function (res) {
                    element.prop('disabled', false);
                    spinner.stop();
                });
            });
        });
    };
}
return LoadingSpinnerDirective;
})();

用法示例:

<button class="btn btn-default" loading-spinner="saveAttribute(model)">Save</button>
<button class="btn" confirm-delete="deleteAttribute(attribute)">Delete</button>

1 个答案:

答案 0 :(得分:1)

<div loading-spinner confirm-delete />

使用优先级来确保正确的顺序。