Angularjs $scope更改未在angular 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

我目前正在将一个成熟的应用程序从angular 1.0.8升级到1.2.16版本。 在应用程序中,我们确实有很多封装引导的指令。大概是这样的:

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);