在Angular Protractor测试运行后,是否可以让测试浏览器窗口保持打开状态?我在FireFox中遇到了严峻的测试失败,访问网页状态以查看正在发生的事情非常有用.
我在这里遗漏了一些明显的东西.在我的指令中,我有一个工作的双向数据绑定,但我似乎无法使用$ scope.$ watch()来监视指令的父作用域js对象上可能发生的更改.
正如您所看到的,当我尝试在attrs.dirModel上使用$ watch时,结果值是未定义的,并且没有进一步观察,即使我在短暂延迟后修改对象.我也试过在$ watch语句中使用(而不是使用)true标志.
HTML:
<script src="http://code.jquery.com/jquery-1.9.1.min.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.0.4/angular.min.js"></script>
<div ng-app="test" ng-controller="MainCtrl">
<dir dir-model="model"></dir>
<p>{{model.tbdTwoWayPropA}}</p>
</div>
<script type="text/ng-template" id="template">
<div class="test-el">{{dirModel.tbdTwoWayPropB}}</div>
</script>
Run Code Online (Sandbox Code Playgroud)
JS:
var app = angular.module('test', []);
app.controller("MainCtrl", [
"$scope", "$timeout",
function($scope, $timeout){
$scope.model = {
tbdTwoWayPropA: undefined,
tbdTwoWayPropB: undefined,
tbdTwoWayPropC: undefined
}
// TBD Ajax call
$timeout(function(){
// alert("Model updated, but $scope.$watch isn't seeing it.");
$scope.model.tbdTwoWayPropA = 1;
$scope.model.tbdTwoWayPropB = 30;
$scope.model.tbdTwoWayPropC = [{ a: 1 },{ a: 2 },{ a: 3 }];
}, 2000) …Run Code Online (Sandbox Code Playgroud) 我正在开发一个应用程序,我们使用PDFJS在应用程序内渲染 PDF。这些 PDF 托管在 S3 上,由于跨源问题,打印它们变得很棘手。
我们构建了一个特殊的视图,用作 iframe 代理,并托管在我们的服务器上(以消除跨域)。iframe 代理依次加载另一个具有实际 S3 PDF 内容的 iframe。
在 FireFox 中,我们可以通过运行以下命令成功打印代理 iframe:
var iframe = document.getElementById('printIframe')
iframe.focus()
iframe.contentWindow.print()
Run Code Online (Sandbox Code Playgroud)
但是,在 Chrome 和 Safari 中,此方法会生成空白页面。有什么想法吗?
我们也进行了测试var pdfWindow = window.open( pdfUrl ); pdfWindow.print();,但这同样不成功。
编辑详细信息:
iframe 代理代码非常简单。
我们正在托管iframe_proxy.html?path-to-s3-file.pdf,它像这样填充嵌套的 iFrame 。
<!DOCTYPE html>
<html>
<head>
<style type="text/css">
html,
body,
iframe {
display: block;
height: 100%;
width: 100%;
margin: 0;
padding: 0;
border-style: none;
}
</style>
</head>
<body>
<iframe frameborder="0" height="100%" src="path-to-s3-file.pdf" width="100%"></iframe>
</body> …Run Code Online (Sandbox Code Playgroud) 我有一个Rails应用程序,它有一些复杂的路由.我的Angular应用程序存在于深层URL中,例如/ quizzes/1
我希望这样做Angular是通过在我的路由配置中注入$ window然后嗅探$ window.location.pathName.这似乎不可能,因为应用程序在此阶段抛出"来自myApp的未知提供者:$窗口".
有没有一种最佳实践方法来处理Angular?我想这样做的原因是当应用程序位于深层目录中时使用HTML5模式.
这是我希望的一个例子,http://jsfiddle.net/UwhWN/.我意识到如果它是唯一的选项,我可以在程序的这一点使用window.location.pathname.
HTML:
<div ng-app="myApp"></div>
Run Code Online (Sandbox Code Playgroud)
JS:
var app = angular.module('myApp', [])
app.config([
'$window', '$routeProvider', '$locationProvider',
function($window, $routeProvider, $locationProvider) {
var path = $window.location.pathname
// Coming Soon
// $locationProvider.html5Mode(true)
$routeProvider
.when(path + '/start', {
controller: 'splashScreenController',
templateUrl: 'partials/splash-screen.html'
})
.when(path + '/question/:id', {
controller: 'questionController',
templateUrl: 'partials/question-loader.html'
})
.otherwise({
redirectTo: path + '/start'
})
}])
Run Code Online (Sandbox Code Playgroud) AngularJS没有内置的DOM选择引擎,但提供了实用方法,可以处理jQuery为典型应用程序提供的部分内容.
但是,DOM选择仍然是王者,我试图将jQuery从我的应用程序中删除,仅用于DOM选择的唯一目的.
Angular提供$ document服务作为注入.我发现这很麻烦.例如,要使用$ document实现本机DOM选择,您需要将$ document注入所需的所有指令并调用querySelectorAll,然后使用Angular扩展它:
angular.element( $document[0].querySelectorAll('#element') )
Run Code Online (Sandbox Code Playgroud)
这太傻了.
在那里,我已经为自己提供了一个全球帮手,但它没有使用Angular的包装$文件......
// Create a shortcut to querySelectorAll
window.query = function(selector) {
return document.querySelectorAll( selector )
}
// For use inside a directive like so...
angular.element( query('#element') )
Run Code Online (Sandbox Code Playgroud)
AngularJS对于全局变量是全能的,并且包裹全局变量以保护和测试.有没有一种干净的方法我可以利用querySelectAll而不将$ document传递给每个指令?我可以像jQuery一样扩展angular.element但是利用querySelectorAll吗?
编辑:
我还想注意原始的JQLite库支持基本选择器https://code.google.com/p/jqlite/wiki/UsingJQLite#Supported_Selectors.
然而,AngularJS实现不支持选择器,也没有提到这个功能遗漏 - http://docs.angularjs.org/api/angular.element
相反,AngularJS会:
throw Error('selectors not implemented');
Run Code Online (Sandbox Code Playgroud)
^当传递给angular.element的项是一个不以'<'开头的字符串.
如果是这样的话会很好:
return document.querySelectorAll( element )
Run Code Online (Sandbox Code Playgroud)
...具有一些基本的错误预防逻辑.
我正在开发一个应用程序,并且Angular提供了一些我认为有用的方法.我启动了一个文件,用所需的方法扩展Angular,而不是创建一个实用程序服务并注入它(对于简单的jQuery-esque - 方法来说这似乎很麻烦).
所以,我一直在问我这是不是一个好主意?有理由避免这种做法吗?
例如 angular.extensions.js
// Angular has been previously loaded
;(function() {
angular.extend(angular, {
isEmptyObject: function(obj) {
var name;
for ( name in obj ) {
return false;
}
return true;
}
// etc. for simple helpers
})
})();
Run Code Online (Sandbox Code Playgroud)