我是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。 ......这怎么可能?
感谢您指出我正确的方向。
答案 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并了解我们在那里所做的事情。