Angularjs $scope更改未在angular 1.2.16中应用
我目前正在将一个成熟的应用程序从angular 1.0.8升级到1.2.16版本。 在应用程序中,我们确实有很多封装引导的指令。大概是这样的:Angularjs $scope更改未在angular 1.2.16中应用,angularjs,angularjs-directive,angularjs-scope,Angularjs,Angularjs Directive,Angularjs Scope,我目前正在将一个成熟的应用程序从angular 1.0.8升级到1.2.16版本。 在应用程序中,我们确实有很多封装引导的指令。大概是这样的: contacts.directive("contactsearch", function($http, $parse, $modal) { return { restrict: 'A', require: 'ngModel', link: fu
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;
}
}
});
}
}
}
});
出于好奇,既然
contactsearch
不使用隔离作用域,是否有任何东西阻止您直接更新绑定变量(即scope.contact=contacts[i]
而不是使用$apply()
和$parse()
)。由于我正在更新任何angular事件之外的作用域,我想将赋值包装在$apply()中,否则angular将不会意识到更改,对吗?使用$parse的原因是,ng模型中的表达式可能更复杂。比如foo.bar.contact。至少我认为这样做是正确的。我错了吗?啊,也许我表达的不对。实际上,将$parse
与$apply
一起使用是正确的。我想知道的是,为什么不通过scope
使用引用操作ng模型
绑定。希望这能澄清我想问的问题。非常感谢你的帮忙!不幸的是,我还没有真正理解你的意思。指令d1不适用于我的问题,因为控制器范围可能包含任何内容。这就是wy,我用的是ng模型。d2基本上包含了我试图做的事情。我认为联系人是在作用域中设置的(使用调试器控制台)。但在执行完指令后,赋值不知何故丢失了。这就是视图没有更新的原因。我还使用解析器和格式化程序(请参阅原始文章中的编辑)。这可能是个问题吗?我明白你现在的处境了。不幸的是,在没有看到代码的情况下,我唯一能提供的另一个建议是检查代码中的任何内容都不会影响您。
<input type="text" data-contactsearch data-ng-model="contact">
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);