我有一个带有地址的表格。我收集的第一个地址字段是邮政编码。输入邮政编码后,自定义指令会查询外部 API 并获取包含城市、州、县和该州所有县的列表的对象。
在 zipcode 字段中,我在分配给 City、State 和 County 输入字段的模型中传递了属性。该指令接受这些并填充scope
变量,以便同步每个变量的值。
我的问题在县选择框上。我需要首先使用该州所有县的列表填充该字段(同样,所有可用选项都由 API 响应提供)。填充该字段后,我需要设置该值。
设置很容易。有用。我一生都无法弄清楚如何使用可用选项填充该字段。
- 我不能使用元素 ID,因为我需要此指令可重复用于此表单中的多个地址。
- 我不能使用 ng-options,至少在我看来,因为在输入邮政编码之前我没有要填充的数据。
这是我的表单的一小段,显示了邮政编码和县域:
<div class="form--row">
<div class="form--col5">
<label class="form--label" for="nbZip">Zip</label>
<input
id="nbZip"
class="form--input"
type="text"
ng-model="data.ClientDetails.zip"
ng-required="data.Client == 'true'"
blur="update()"
ziplookup
zip-city="data.ClientDetails.city"
zip-state="data.ClientDetails.state"
zip-county="data.ClientDetails.county"
>
</div>
<!-- First Client NB County -->
<div class="form--row">
<div class="form--col5">
<label class="form--label" for="nbCounty">County</label>
<select class="form--input" id="nbCounty" ng-model="data.ClientDetails.county" ng-required="data.Client == 'true'" change="update()">
<!-- generate county list! -->
</select>
</div>
</div>
还有我的指令:(ZipCode 是我注入指令的自定义服务。)
directives.directive(
'ziplookup',
['ZipCode',
function (ZipCode) {
var scope
, element
, zipData;
var getZipData = function (event) {
// When this function is called, `this` is
// bound to the scope matching the element.
scope = this;
// We also get access to the element itself.
element = $(event.target);
ZipCode
// Shoot off our call for the location data,
// using the value in the `<input>`.
.getLocationData(element.val())
// When data is returned, we will set the
// returned data.
.then(setZipData)
// Update the view with the returned data.
.then(updateCity)
.then(updateState)
.then(updateCounty)
};
var setZipData = function (data) {
// This function makes the scope and data
// accessible from the `update___` functions
// that follow.
// We'll set `zipData` to the returned data.
zipData = data.data;
};
var updateCity = function () {
scope.city = zipData.city;
};
var updateState = function () {
scope.state = zipData.state;
};
var updateCounty = function () {
scope.county = zipData.county;
};
var link = function (scope, elem) {
elem.bind('blur', angular.bind(scope, getZipData));
};
return {
restrict: 'A',
scope: {
city: '=zipCity',
state: '=zipState',
county: '=zipCounty'
},
link: link
};
}]);