我目前正在将成熟的应用程序从角度1.0.8升级到1.2.16版本。 在应用程序中,我们有很多指令封装bootstraps typeahead。像这样:
contacts.directive("contactsearch",
function($http, $parse, $modal) {
return {
restrict: 'A',
require: 'ngModel',
link: function(scope, element, attrs, ngModel) {
var contacts = Array();
//... xhr gets called. Then in the bootstrap
// update callback when results are present:
scope.$apply(function() {
for (var i=0; i < contacts.length; i++) {
var ident = contacts[i].firstName + " " + contacts[i].lastName + " - " + contacts[i].company;
if (ident == item) {
$parse(attrs.ngModel).assign(scope, contacts[i]);
return;
}
}
});
}
}
}
});
HTML:
<input type="text" data-contactsearch data-ng-model="contact">
这曾经很好用。升级到1.2.16后,联系人仍应用于data-ng-model指定的父作用域属性,但视图未更新。我在这里缺少什么?
修改
此外,我在指令中使用了以下函数以及角度解析器和格式化程序:
function toContact(text) {
if (text == "")
$parse(attrs.ngModel).assign(scope, null);
}
function fromContact(contact) {
if (contact !== undefined && contact != null) {
var x = "";
if (contact.firstName && contact.firstName != null)
x += contact.firstName;
if (contact.lastName && contact.lastName != null)
x += " " + contact.lastName;
if (contact.company && contact.company != null)
x += " " + contact.company;
linkIcon(contact);
return x;
}
}
ngModel.$parsers.push(toContact);
ngModel.$formatters.push(fromContact);