AngularJS如何处理服务名称之间的冲突?例如,如果我声明了两个模块,每个模块包含一个名为'foo'的服务.如果我想创建可重用模块或想避免与其他第三方模块发生冲突,那么"命名空间"服务的好方法是什么?
我正在尝试用Jasma测试我的AngularJS控制器,使用Karma.但是$timeout在现实生活中运作良好的一个,会使我的测试崩溃.
控制器:
var Ctrl = function($scope, $timeout) {
$scope.doStuff = function() {
$timeout(function() {
$scope.stuffDone = true;
}, 250);
};
};
Run Code Online (Sandbox Code Playgroud)
Jasmine它阻塞(在哪里$scope和控制器已正确初始化):
it('should do stuff', function() {
runs(function() {
$scope.doStuff();
});
waitsFor(function() {
return $scope.stuffDone;
}, 'Stuff should be done', 750);
runs(function() {
expect($scope.stuffDone).toBeTruthy();
});
});
Run Code Online (Sandbox Code Playgroud)
当我在浏览器中运行我的应用程序时,$timeout将执行函数并且$scope.stuffDone将为true.但在我的测试中,$timeout什么都不做,该函数永远不会被执行,并且Jasmine在超时750 ms后报告错误.这可能有什么问题?
我想编写一个带有隔离范围的指令,但也想让该范围可用于父范围的控制器.我找到了这个解决方案
<div ng-controller="Main">
<popupbutton directive-scope="popup"></popupbutton>
</div>
app.directive('popupbutton', [function() {
return {
restrict: "E",
scope: {
directiveScope: "="
},
link: function(sc, el, attrs) {
sc.directiveScope = sc;
sc.testvalue = 'foo';
}
};
}]);
app.controller('Main', function($scope) {
alert($scope.popup.testvalue); // Where did the property 'popup' come from?!?
});
Run Code Online (Sandbox Code Playgroud)
见Plunker.
我发现这有点难看,因为它涉及在HTML中编写属性,而在控制器的代码中,你无法分辨范围属性的来源.有一个更好的方法吗?
编辑:
此外,当运行控制器'Main'时,似乎$ scope.popup甚至不可用.指令的链接功能还没有执行?
我希望我的AngularJS应用程序发出http请求以从服务器检索用户信息或重定向到登录屏幕.我在我的应用程序主模块的运行块中实现了它.但是如何在运行块中测试代码呢?或者我应该在控制器中移动此初始化代码以使其可测试?我正在用Karma和Jasmine写我的测试.
任何帮助,将不胜感激!