我在我的 web 应用程序中使用 Twitter Bootstrap 的 UI。特别是它的警报组件。我想编写一个简单的角度服务来包装 Bootstrap 的警报,以便有可能通知用户任何角度代码的和平。像这样:
Informer.inform("message", "ERROR"); // will result in alerting with `alert-error` class
Informer.inform("message", "INFO"); // will result in alerting with `alert-info` class
我的想法是将模板附加到<body>
:
<div class="alert {{alertClass}} fade in informer" id="informer">
<button type="button" class="close" data-dismiss="alert">×</button>
<div class="valignCenterWrapper">
<div class="valignCenter" id="informerMessage">
{{message}}
</div>
</div>
</div>
像这样的东西:
grfx.factory("Informer", function() {
return {
inform : function(message, type) {
// Here be dragons. How can I compile/append the template.
$("#inform").alert();
}
};
});
我唯一想知道的是:我如何用 Angular 而不是 jQuery 编写这个?上面的代码适合开始吗?互联网上的人说我应该只使用指令进行 DOM 操作。但我不明白:我没有任何现有的标记来应用指令。由于某些计算/用户交互,警报将附加到页面。我应该使用哪些服务($compile
, $parse
, $document
)来编译模板并将其附加到正文的某个位置?
编辑:是否也可以在控制器之外获得 angularjs 服务。只是在普通的 JS 代码中,所以我可以写getServiece("Informer").inform("", "")
?
编辑 2:好的,我现在拥有的:
grfx.factory("Informer", function($compile, $rootScope) {
return {
inform : function(message, type) {
var scope = $rootScope.$new();
scope.message = message;
scope.type = type;
$(document.body).append($compile("<div class='alert {{type}} fade in informer' id='informer'><button type='button' class='close' data-dismiss='alert'>×</button><div class='valignCenterWrapper'><div class='valignCenter' id='informerMessage'>{{message}}</div></div></div>")(scope));
}
};
});
使用此代码,我可以使用来自控制器的注入服务。但是当我尝试在角度代码之外调用服务时出现问题:
angular.element(document).injector().get("Informer").inform("Message", "alert-error");
这显示弹出窗口,{{message}}
例如它没有正确编译模板。