我有一个表单,如果复选框为false,则使用ng-required指令对文本输入强制执行验证.如果复选框为true,则隐藏该字段,并将ng-required设置为false.
问题是我还在输入上指定了验证的正则表达式,并使用了ng-pattern angular指令.我遇到的问题是,如果用户填写了无效的电话号码,请选中该框以停用该输入(因此无需进一步验证),表单将不允许提交,因为它基于ng-pattern无效.
我尝试通过添加ng-change函数来将输入模型设置为null来解决此问题,但是ng-pattern和字段仍然在复选框的初始设置为false时设置为无效.但是,如果我取消选中该框,将所有内容设置回初始表单加载,然后再次选中该框,表单有效并且能够提交.我不确定我错过了什么.这是我到目前为止的ng-change代码:
var phoneNumberRegex = /^\(?(\d{3})\)?[ .-]?(\d{3})[ .-]?(\d{4})$/;
$scope.phoneNumberPattern = phoneNumberRegex;
$scope.removeValidation = function() {
if ($scope.cell._newUser === false) {
$scope.request._number = '';
$scope.phoneNumberPattern = /[0-9a-zA-Z]?/;
} else {
$scope.phoneNumberPattern = phoneNumberRegex;
}
};
Run Code Online (Sandbox Code Playgroud) 我正在尝试开始为我的角度应用程序编写单元测试并快速点击停止块,因为我不确定如何以可测试的方式模拟我的服务.
有没有办法模拟REST调用,否则看起来我需要在我的测试中反映我的服务中的所有内容,这对我来说似乎不对,但我对测试写作是相当新的,所以也许这就是它的假设要完成.任何帮助将不胜感激.
我的服务如下:
angular.module('resources.users', ['ngResource'])
.factory('User', function($resource) {
var resource = $resource('/api/index.php/users/:username', {}, {
'update': {method: 'PUT'}
});
resource.getUser = function(username, successCb) {
return resource.query({username: username}, successCb);
};
return resource;
});
Run Code Online (Sandbox Code Playgroud)
我的测试到目前为止:
describe('User', function() {
var mockUserResource;
beforeEach(module('resources.users'));
beforeEach(function() {
mockUserResource = sinon.stub({
getUser: function(username) {
mockUserResource.query({username: username});
},
query: function() {}
});
module(function($provide) {
$provide.value('User', mockUserResource);
})
});
describe('getUser', function() {
it('should call getUser with username', inject(function(User) {
User.getUser('test');
expect(mockUserResource.query.args[0][0]).toEqual({username: 'test'});
}));
})
});
Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个指令来处理更改表头的图标类.我想要的是(我相信无论如何)处理表头排序的标准方法.该指令将添加一个链接元素,并在用户单击按desc排序时将图标更改为desc,再次单击按asc并再次按该图标排序.这是我到目前为止所做的,但我现在不知道如何处理图标类以及重置同一个表但在指令范围之外的其他元素.任何帮助都会很棒!
angular.directive("tableHeaders", function() {
return {
restrict: 'E',
scope: {},
template:'<i class="glyphicon glyphicon-filter"></i>',
link: function(scope, element, attrs) {
attrs.class = 'glyphicon glyphicon-sort-by-alphabet-alt';
}
}
});
Run Code Online (Sandbox Code Playgroud)
这是我对html方面的看法:
<th>First Name<a ng-click="newOrderBy('_firstName')"><table-headers></table-headers></a></th>
<th>Last Name<a ng-click="newOrderBy('_lastName')"><table-headers></table-headers></a></th>
<tr ng-repeat="item in items | orderBy:orderBy:reverse>
<td>{{item._firstName}}</td>
<td>{{item._lastName}}</td>
</tr>
Run Code Online (Sandbox Code Playgroud)
订单目前在控制器中处理:
$scope.newOrderBy = function(order) {
$scope.orderBy = order;
$scope.reverse = !$scope.reverse;
};
Run Code Online (Sandbox Code Playgroud) 通过我的NGinx设置,我能够拦截来自ajax预检的OPTIONS请求,并使用正确的CORS标头和200响应进行响应,以便请求可以继续进行.我正在尝试将我的前端代理合并到HAProxy中,并且在解决这个难题时遇到了一些问题.
我的特殊问题是,当有服务器能够正确响应OPTIONS请求时,我能够添加正确的CORS选项,但是当发出预检请求时,一些后端无法处理/响应405错误.我的haproxy.cfg包含以下用于添加标题的行:
capture request header origin len 128
http-response add-header Access-Control-Allow-Origin %[capture.req.hdr(0)] if { capture.req.hdr(0) -m found }
rspadd Access-Control-Allow-Credentials:\ true if { capture.req.hdr(0) -m found }
rspadd Access-Control-Allow-Headers:\ Origin,\ X-Requested-With,\ Content-Type,\ Origin,\ User-Agent,\ If-Modified-Since,\ Cache-Control,\ Accept if { capture.req.hdr(0) -m found }
rspadd Access-Control-Allow-Methods:\ GET,\ POST,\ PUT,\ DELETE,\ OPTIONS if { capture.req.hdr(0) -m found }
rspadd Access-Control-Max-Age:\ 1728000 if { capture.req.hdr(0) -m found }
Run Code Online (Sandbox Code Playgroud)
解决方案:
当您从客户端的请求设置所有正确的标头时,如何在不将请求传递给Web服务器的情况下使用HAProxy发送响应,但不是动态的,这不是理想的解决方案.
任何帮助,将不胜感激!
我有一个使用Angular UI的select2元素的部分http://angular-ui.github.io/
我遇到的问题是该元素是必需的,虽然我已成功通过以下代码设置字段,但由于外部更改而不确定Angular的模型不能更新,因此不会删除所需的属性,我不知道如何要么提供$ scope.apply(),要么使用Angular的另一个函数来继续测试.
首先允许运行直接jQuery函数:(取自如何从Angular e2e测试范围执行jQuery?)
angular.scenario.dsl('jQueryFunction', function() {
return function(selector, functionName /*, args */) {
var args = Array.prototype.slice.call(arguments, 2);
return this.addFutureAction(functionName, function($window, $document, done) {
var $ = $window.$; // jQuery inside the iframe
var elem = $(selector);
if (!elem.length) {
return done('Selector ' + selector + ' did not match any elements.');
}
done(null, elem[functionName].apply(elem, args));
});
};
});
Run Code Online (Sandbox Code Playgroud)
然后更改字段值:
jQueryFunction('#s2id_autogen1', 'select2', 'open');
jQueryFunction('#s2id_autogen1', 'select2', "val", "US");
jQueryFunction('#s2id_autogen1', 'select2', 'data', {id: "US", text: "United …Run Code Online (Sandbox Code Playgroud) 我很难获得OAuth.io(https://github.com/oauth-io/oauth-phonegap)撰写的cordova插件,以便在离子手机版本中工作.一切都是基于他们提供的JS文件的桌面版本设置的,包含在Angular服务中以便于单元测试,另一个工厂处理实际的登录/注销流程等...
我遇到的问题是,现在切换到插件版本并删除引用的JS版本后,任何东西都无法工作.我不能再拉起facebook登录页面,也不能在注入的服务之外识别全局对象'OAuth'.我在解决问题时遇到的最大问题是创建了OAuth对象,至少最初是因为我可以注销对象,但之后的任何内容似乎都没有被识别.
我的网络(工作)版本的代码示例在这里是plunker:http://plnkr.co/edit/B4HdkkBKDP3Xv2riQGui?p=preview
任何关于进一步故障排除的想法,或者如果有另一种方法来实现这一目标,将不胜感激!
我在尝试重试功能时遇到了一些麻烦,希望得到一些帮助.我有一个我想要调用的$资源,直到成功条件发生或超过最大重试次数.
我似乎遇到的问题是,在我的重试功能中,我正在调用另一个承诺,这就是检查条件的地方.我可以通过删除添加的承诺并在几次重试后创建默认成功条件来使代码按预期运行,但我无法弄清楚如何正确地将新的promise调用添加到函数中.
resource 是一个Angular $资源的替身,它返回$ promise
我的代码如下:
resource.$promise.then(function (response) {
return keepTrying(state, 5);
}).then(function (response) {
}).catch(function (err) {
console.log(err);
});
Run Code Online (Sandbox Code Playgroud)
而keepTrying功能:
function keepTrying(state, maxRetries, deferred) {
deferred = deferred || $q.defer();
resource.$promise.then(function (response) {
success = response;
});
if (success) {
return deferred.resolve(success);
} else if (maxRetries > 0) {
setTimeout(function () {
keepTrying(state, maxRetries - 1, deferred);
}, 1000);
} else if (maxRetries === 0) {
deferred.reject('Maximum retries exceeded');
}
return deferred.promise;
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Topaz Systems签名板将电子签名合并到我的Web应用程序中.一切似乎都在Internet Explorer中工作,因为签名板使用Active X访问插入USB端口的打击垫.然而,我的Web应用程序依赖于Chrome,因此我试图在Chrome中进行合作.
我尝试过使用Active X for Chrome插件Active X for Chrome失败了
该插件本身似乎正在工作,并且有输出到控制台,但我无法签署该框.
我目前正在尝试使用Topaz Site Demos中的简单
演示
任何有关如何实现这一目标的帮助或指示将不胜感激!
我在使用angular bootstrap-ui btn-checkbox指令及其与ng-repeat指令的交互方面遇到了一些麻烦.指令的设置方式是您必须为多个复选框方案手动命名每个单独的模型,这在ng-repeat中是不可能的,或者我还没有找到如何完成此操作.
我找到了一个类似于这个问题的答案:
然后分叉了这个问题,以便更好地解释我所看到的问题.可以查看plunker:
我有一段时间让这个工作,无法在任何地方找到一个可靠的答案所以我想我会把我的解决方案发布到SO所以其他人可能会觉得它很有用.
我想在我的MX服务器上的一个单独的虚拟机上运行我的所有SSL站点,而iRedMail的默认情况并非如此.使用nginx在新服务器上运行phpMyAdmin和roundcube非常简单,这里不会介绍,使用uwsgi让管理面板在nginx下运行并不容易.
最终结果是一台服务器只作为邮件服务器,一台服务器运行nginx进行Web管理.
我试图实现一个PHP脚本循环的实时轮询,到目前为止没有运气.这是我到目前为止:
在表格提交上:
$.ajax({
data: $(this).serialize(),
success: showResponse,
url: 'process.php',
type: 'post'
});
function showResponse(){
$.ajax({
type: "GET",
url: "progress.php",
cache: false,
success: function(data) {
var response = $.parseJSON(data);
if (response.processing === true) {
console.log("Current Item: " + response.currentItem +
"Total Items: " + response.totalItems +
"Percent Complete: " + response.percentComplete);
setTimeout(checkProgress, 1000);
});
}
Run Code Online (Sandbox Code Playgroud)
在process.php脚本中:
session_start();
echo json_encode(array("processing" => true));
$totalItems = 10000000;
$_SESSION['totalItems'] = $totalItems;
$_SESSION['processing'] = true;
$_SESSION['error'] = false;
for ($i=0; $i <= $totalItems; $i++) {
$_SESSION['currentItem'] …Run Code Online (Sandbox Code Playgroud) angularjs ×7
ajax ×2
angular-ui ×2
javascript ×2
cordova ×1
cors ×1
haproxy ×1
html ×1
jquery ×1
nginx ×1
oauth ×1
php ×1
preflight ×1
promise ×1
ssl ×1
ubuntu ×1
ubuntu-12.04 ×1
ui-select2 ×1