我有一个监视绑定的指令,奇怪的是,如果变量立即更改,手表会关闭,但如果它等到http调用返回,那么它就不会触发手表。 奇怪的是它触发控制器看起来很好,但不是指令,即使它们基本上是同一个。
以下是一些描述问题的代码段。 指令:
.directive('afcAutocomplete', function() {
return {
restrict: 'AEC',
scope: {
binding: '=ngModel',
source: '=',
filter: '=?',
[...]
},
templateUrl: '/afc_template/afc-autocomplete.html',
controller: function($scope, $element, $attrs, $compile, $timeout) {
[...]
$scope.$watch('binding', function(newValue) {
console.log('new val: ', newValue);
setDisplayBinding(newValue);
});
[...]
root controller:
app.controller("editController", function($scope, $http, $routeParams) {
if($routeParams.id)
qDocument = editFormUtility.load($routeParams.id, $routeParams.document_type); //returns a $http call to an API
else {
qDocument = {
header: {
id: guid(),
schema : $routeParams.document_type,
languages: ["en"]
},
government: $scope.userGovernment() ? { identifier: $scope.userGovernment() } : undefined,
};
[...]
控制器:
app.controller("editMeasure", function ($scope) {
$controller('editController', {$scope: $scope});
$scope.$watch('document.government', function() {
if($scope.document)
console.log('government changed: ', $scope.document.government);
});
[...]
editMeasure模板:
<div afc-autocomplete ng-model="document.government" source="ac_countries" filter="genericFilter"></div>
令我感到困惑的是,如果我开始一个新文件,那么手表可以工作,但是如果我编辑一个文件,并且它通过$ http调用,那么控制器手表仍然有效,但指令手表不起作用。在控制台日志方面,我看到&#34;文件:&#34;,然后&#34;政府更改&#34;作为最后一条消息,所以没有&#34;新的val:&#34; &#34;文件之后的消息:&#34; log,这是我们更改文档的指标。 另一个说明。该文件最初未定义,然后成为政府的对象&#39;设置为另一个对象,例如{id:&#39; ca&#39;}。
答案 0 :(得分:1)
感谢Vaidik帮助我找到答案。
问题是如果在当前未定义的绑定上创建了监视,那么当您设置它时,它将无法工作。所以你需要确保将绑定设置为某种东西。
在我的情况下,我设置$ scope.document = {},然后绑定工作。
Angular是一个奇怪的野兽。任何人都可以在评论中解释为什么设置$ scope.document = {},允许我的$ scope.document.government手表突然工作,即使我最终完全替换了分配给$ scope.document的对象(我给它是一个全新的对象,我不只是设置属性)?我很困惑,因为你不可能通过常规引用来做到这一点,因为我为$ scope.document设置了一个新的引用,所以Angular正在做一些神奇的事情,我感觉到了它所做的事情可以帮助我解决未来的问题。