我使用 jquery 自动完成功能和 ajax 自动填写 3 个输入字段,即产品代码、描述和价格。还有两个字段:数量和总计,它们使用 Angular 。
我的问题是两个 Angular 字段不知道用户何时使用了自动完成功能。当您更改数量时,它无法读取输入的价格,除非您手动更改价格。
我查看过 $watch、$apply、ng-change,但 Angular 一次又一次无法从自动完成功能中看到我的超出范围的变量。
在此处的 Plunker 中查看它 http://run.plnkr.co/plunks/8g88JUPDjUfvCWupxKyT/ 注意:在“代码”输入中搜索以01开头的产品代码。
这是我的代码
<!DOCTYPE html>
<html>
<head>
<link data-require="<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="711b00041403085c041831405f495f4047" rel="noreferrer noopener nofollow">[email protected]</a>" data-semver="1.8.16" rel="stylesheet" href="http://code.jquery.com/ui/1.8.16/themes/smoothness/jquery-ui.css" />
<script data-require="<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="7c160d09190e053c4d5248524e" rel="noreferrer noopener nofollow">[email protected]</a>" data-semver="1.4.2" src="//cdnjs.cloudflare.com/ajax/libs/jquery/1.4.2/jquery.js"></script>
<script data-require="<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="9af0ebefffe8e3b7eff3daabb4a2b4abac" rel="noreferrer noopener nofollow">[email protected]</a>" data-semver="1.8.16" src="http://code.jquery.com/ui/1.8.16/jquery-ui.js"></script>
<script data-require="<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="9dfcf3fae8f1fcefb3f7eeddacb3a9b3af" rel="noreferrer noopener nofollow">[email protected]</a>" data-semver="1.4.2" src="https://code.angularjs.org/1.4.2/angular.js"></script>
<link rel="stylesheet" href="style.css" />
<script src="script.js"></script>
</head>
<body>
<script type="text/javascript">
jQuery(document).ready(function() {
$('.code1').autocomplete({
source: [{
"value": "01-A",
"prod_desc1": "Extra Large Elephant",
"price1": "20.00",
"prod_code1": "01-A",
"image1": ""
}, {
"value": "01-A-BE",
"prod_desc1": "Extra Large Elephant Bookends (pair)",
"price1": "20.00",
"prod_code1": "01-A-BE",
"image1": ""
}, {
"value": "01-A-Q",
"prod_desc1": "Extra Large Ele full colour",
"price1": "20.00",
"prod_code1": "01-A-Q",
"image1": ""
}, {
"value": "01-B",
"prod_desc1": "Large Elephant",
"price1": "20.00",
"prod_code1": "01-B",
"image1": ""
}, {
"value": "01-B-CH",
"prod_desc1": "Large Ele - Candle holder",
"price1": "20.00",
"prod_code1": "01-B-CH",
"image1": ""
}, {
"value": "01-B-PL",
"prod_desc1": "Large Ele Stem Plate",
"price1": "20.00",
"prod_code1": "01-B-PL",
"image1": ""
}, {
"value": "01-BA",
"prod_desc1": "XL-Ben Elephant",
"price1": "20.00",
"prod_code1": "01-BA",
"image1": ""
}, {
"value": "01-BB",
"prod_desc1": "DESIGNER ELEPHANT",
"price1": "20.00",
"prod_code1": "01-BB",
"image1": ""
}, {
"value": "01-BC",
"prod_desc1": "Medium-ben's-elephant",
"price1": "20.00",
"prod_code1": "01-BC",
"image1": ""
}, {
"value": "01-BD",
"prod_desc1": "DESIGNER ELEPHANT",
"price1": "20.00",
"prod_code1": "01-BD",
"image1": ""
}],
minLength: 2,
select: function(evt, ui) {
// when a product code is selected, populate related fields in this form
this.form.prod_desc1.value = ui.item.prod_desc1;
this.form.price1.value = ui.item.price1;
$("#image1").html(ui.item.image1);
}
});
});
</script>
<style type="text/css">
/* style the auto-complete response */
li.ui-menu-item {
font-size: 12px !important;
}
</style>
<div ng-app="myApp" ng-controller="OrderController" class="row">
<div class="page-header">
<h1>Order Form</h1>
<form onsubmit="return false;">
<table>
<thead>
<tr>
<th>Image</th>
<th>Code</th>
<th>Desc</th>
<th>Price</th>
<th>Qty</th>
<th>Total</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<div class="order-image">
<span id="image1"></span>
</div>
</td>
<td>
<input id="code1" type="text" class="code1 order-code" />
</td>
<td>
<input class="order-prod_desc" id="prod_desc1" type="text" />
</td>
<td>
<input ng-model="price1" ng-change="change()" class="order-price" id="price1" name="price1" type="number" />
</td>
<td>
<input ng-model="quantity1" class="order-price" id="quantity1" type="number" value="" />
</td>
<td>
<input class="order-price" id="total1" type="number" value="{{price1 * quantity1}}" step="0.01" />
</td>
</tr>
</tbody>
</table>
</form>
</div>
</div>
<script>
var myApp = angular.module('myApp', []);
myApp.controller('OrderController', function($scope) {
function change() {
alert("a");
var scope = angular.element($("#price1")).scope();
scope.$apply(function() {
scope.price1 = scope;
});
}
});
</script>
<script data-require="bootstrap@*" data-semver="3.3.5" src="//maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
<script data-require="bootstrap@*" data-semver="3.3.5" src="//maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.js"></script>
</body>
</html>
最佳答案
问题是您需要访问字段的模型而不是字段本身,您需要获取输入字段模型的句柄,修改它,然后应用这些更改,该怎么做?其实很简单
function jqueryAutoCompleteHandler(){
// other stuff
var angularElement=angular.element(element);
var scope = angularElement.scope();
var parser = angularElement.injector().get('$parse');
var getter = parser(angularElement.attr('ng-model'));
var setter = getter.assign;
setter(scope, value)
scope.$apply();
}
类似的东西应该可以工作。可能需要一些小的变化和拼写检查。但这就是总体思路。 检查这个笨蛋http://plnkr.co/edit/XB7t3sePl3QbkopOoR3U?p=preview
关于jquery - ajax 自动完成填充多个字段后,Angular 不读取输入更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32600798/