angularjs – 我可以直接在templateUrl上使用Angular服务中的$compile而不是原始HTML或原始angular.element吗?

给定以下用于创建“对话框”元素(即模态)的服务:
app.service('dialog',['$document','$compile','$rootScope',function($document,$compile,$rootScope) {

        var body = $document.find('body');
        var scope = $rootScope.$new();

        this.createDialog = function() {
            var dialogElem = angular.element('<div ng-include="\'/dialog.html\'"></div>');
            $compile(dialogElem)(scope);
            body.append(dialogElem);
        };

    }
]);

可以在控制器中使用,如下所示:

$scope.someFunction = function() {
    dialog.createDialog();
};

有没有办法可以使用$compile或其他任何东西在我的服务中没有HTML?我真的更喜欢只调用一个指令,因此运行createDialog()会立即将指令注入我的DOM,因此该指令负责将新控制器和模板链接在一起.如果我以错误的方式解决这个问题,我对建设性的想法完全开放.

你当然可以!在这里你去:
app.factory('modalService',function ($document,$rootScope,$templateCache,$http) {

    var body   = $document.find('body'),modals = [];

    var service = {
        show: function (template,data,modal) {

            // The template's url
            var url = 'template/modal/' + template + '.html';

            // A new scope for the modal using the passed data
            var scope = $rootScope.$new();
            angular.extend(scope,data);

            // Wrapping the template with some extra markup
            modal = modal || angular.element('<div class="modal"/>');

            // The modal api
            var api = {
                close: function () {

                    modal.remove();
                    scope.$destroy();
                    modals.splice(modals.indexOf(api),1);

                },replace: function (template,data) {

                    return angular.extend(api,service.show(template,modal));
                }
            };

            // Adding the modal to the body
            body.append(modal);

            // A close method
            scope.close = api.close;

            // Caching the template for future calls
            $http.get(url,{cache: $templateCache})
                .then(function (response) {

                    // Wrapping the template with some extra markup
                    modal.html('<div class="win">' + response.data + '</div>');

                    // The important part
                    $compile(modal)(scope);
                });

            modals.push(modal);

            return api;
        },showOrReplaceLast: function (template,data) {

            return service.show(template,modals.length > 0 ? modals[modals.length - 1] : null);
        }
    };

    return service;
});

一些说明:

>您需要在DOM中的某处插入模式,这就是注入$document的原因.>是的,您可以从这里取出模态标记.>记得为对话框创建新的范围并销毁它们($rootScope.$new).>这是一个WIP,我希望它足够清楚.

相关文章

AngularJS 是一个JavaScript 框架。它可通过 注:建议把脚本放在 元素的底部。这会提高网页加载速度,因...
angluarjs中页面初始化的时候会出现语法{{}}在页面中问题,也即是页面闪烁问题。出现这个的原因是:由于...
AngularJS 通过被称为指令的新属性来扩展 HTML。AngularJS 指令AngularJS 指令是扩展的 HTML 属性,带有...
AngularJS 使用表达式把数据绑定到 HTML。AngularJS 表达式AngularJS 表达式写在双大括号内:{{ expres...
ng-repeat 指令可以完美的显示表格。在表格中显示数据 {{ x.Name }} {{ x.Country }} 使用 CSS 样式为了...
$http是 AngularJS 中的一个核心服务,用于读取远程服务器的数据。读取 JSON 文件下是存储在web服务器上...