如何使用服务启动模态(指令)

时间:2014-02-14 11:41:26

标签: javascript angularjs

我是Angular的新手。不确定我在这里缺少什么以及从哪里开始寻找。

我需要在我的应用程序中重用(Twitter Bootstrap)模式对话框。我看过Angular UI,但我想自己构建它们 - 也是为了能够理解它是如何工作的。

我有:

在我看来:

<div cng-modal title="Create new user" submit="saveNewUser()">
    <div ng-include=" 'templates/newUserForm.html' "></div>
</div>

我的指示:

UserManagerApp.directive('cngModal', function () {
    return {
        restrict: 'A',
        replace: true,
        transclude: true,
        scope: {
            title: '@title',
            submit: '&'
        },
        templateUrl: 'templates/modal.html',
        controller: function($scope, $element, $attrs, $location) {
            $scope.submitHandler = function() {
                $scope.submit();
            };
        },
        link: function (scope, element, attrs) {
            console.log(element);
        }
    };
});

我的modal.html模板:

<div id="newUserModal" class="modal hide" data-backdrop="static" tabindex="-1">
  <div class="modal-header">
    <button type="button" class="close" data-dismiss="modal">×</button>
    <h3>{{ title }}</h3>
  </div>

  <div class="modal-body" ng-transclude></div>

  <div class="modal-footer">
    <div class="btn-group">
      <button type="button" class="btn btn-primary btn-action btn-submit" ng-click="submitHandler()"><i class="icon-ok"></i> Save</button>
      <button type="button" class="btn btn-action btn-cancel" data-dismiss="modal"><i class="icon-remove"></i> Cancel</button>
    </div>
  </div>

最后(部分)我的控制器:

UserManagerApp.controller('UserManagerCtrl', ['$scope', 'ajaxService', '$route', function($scope, ajaxService, $route) {
    $scope.showNewUserModal = function () {
        $('#newUserModal').modal('show');
    };

    $scope.saveNewUser = function () {
        console.log('saving user');
    };
}]);

问题

现在我的模态打开了,因为我在modal.html中给了它ID“newUserModal”,在我的控制器showNewUserModal()触发器中用它的ID打开那个模态。

我希望有一个服务,我可以在我的控制器中调用,根据我的指令构建一个新的模态并打开它。无需分配任何ID。 ......这怎么可能?

感谢您指出我正确的方向。

1 个答案:

答案 0 :(得分:1)

在ui-bootstrap的$ modal中,我们做了5件这样的事情(你的当然可以很简单)。

我们有一个stackMap来堆叠我们的对话框(你可以有多个)。

然后我们有一个背景指令和一个模态本身的指令。

我们有一个工厂,它将准备一个新的模态,即获取其模板,解析它所具有的结果,如果需要的话创建一​​个控制器,一个新的范围...当我们说准备时,我们使用另一个工厂(按照目的建造工厂很好),可以手工创建新的背景和模型,如:

var angularDomEl = angular.element('<div modal-window></div>');
angularDomEl.attr('window-class', modal.windowClass);
angularDomEl.attr('index', openedWindows.length() - 1);
angularDomEl.attr('animate', 'animate');
angularDomEl.html(modal.content);
var modalDomEl = $compile(angularDomEl)(modal.scope);

然后我们只需将它附加到身体上。

所以我的想法是拥有一个工厂,它将手工创建元素并对其进行配置,然后将其附加到正文中。

我强烈建议您更深入地阅读$ modal并了解我们在那里所做的事情。