gpt4 book ai didi

jquery - AngularJS 通知服务

转载 作者:行者123 更新时间:2023-12-03 22:58:45 25 4
gpt4 key购买 nike

我在我的网络应用程序中使用 Twitter Bootstrap 作为 UI。特别是它的Alert成分。我想编写一个简单的 angular.service 来包装 Bootstrap 的警报,以便能够通知用户任何 Angular 代码的和平。像这样:

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 )来编译模板并将其附加到正文的某处?

编辑:是否也可以在 Controller 之外获取 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));
}
};
});

通过此代码,我可以使用 Controller 中注入(inject)的服务。但是当我尝试在 Angular 代码之外调用服务时出现问题:

angular.element(document).injector().get("Informer").inform("Message", "alert-error");

这显示弹出窗口 {{message}}例如它无法正确编译模板。

最佳答案

在 AngularJS 中,我们应该关注模型操作,您的 Informer 服务也不异常(exception) - 它应该只保存模型,而不应该关心 DOM 操作。 DOM操作=指令的经验法则是一个非常好的法则,如果你遵循它,它将为你省去很多麻烦。

回到您手头的问题,解决方案是提供一个专注于模型操作的服务和一个显示该模型的指令。让我们从服务开始:

app.factory('Informer', function(){

var messages = [];
var Informer = {};

Informer.inform = function(msg, type) {
messages.push({
msg: msg,
type: type
});
};

Informer.allInfos = function() {
return messages;
};

Informer.remove = function(info) {
messages.splice(messages.indexOf(info), 1);
};

return Informer;
});

此服务准备就绪后,您可以轻松地在 Controller 中使用它(甚至在其他服务中!):

app.controller('MainCtrl', function($scope, Informer) {

Informer.inform("error message", "error");
Informer.inform("info message", "info");

$scope.allInfos = Informer.allInfos;
$scope.remove = Informer.remove;
});

最后,要呈现警报,您可以直接使用 Bootstrap 的标记,或者编写一个非常简单的指令来封装它。在这里,我使用 http://angular-ui.github.com/bootstrap/ 中的警报指令

<body ng-controller="MainCtrl">
<alert ng-repeat="alert in allInfos()" type="alert.type" close="remove(alert)">{{alert.msg}}</alert>
</body>

当然,您不需要使用此存储库中的指令,您可以创建自己的指令或根据需要使用原始标记。

这是一个 plunker 演示的工作示例:http://plnkr.co/edit/VxAcjHFhxXODFB5iAfyX?p=preview

总结一下:

  • 根据经验,不要在指令之外进行 DOM 操作
  • 处理模型的服务应与模型的表示分离

我还建议在学习 AngularJS 时从项目中删除 jQuery。这样你就能更快地进入 AngularJS-zen 状态!

关于jquery - AngularJS 通知服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14802584/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com