Angularjs 监视在控制器上触发,但不是指令

Angularjs 监视在控制器上触发,但不是指令,angularjs,Angularjs,我有一个监视绑定的指令,奇怪的是,如果立即更改变量,则监视会关闭,但如果它等待http调用返回,则不会触发监视。 奇怪的是,它会触发控制器的监视,但不会触发指令监视,即使它们基本上在同一个监视器上 下面是一些描述该问题的代码片段。 指令: .directive('afcAutocomplete', function() { return { restrict: 'AEC', scope: { binding: '=ngModel', source: '=',

我有一个监视绑定的指令,奇怪的是,如果立即更改变量,则监视会关闭,但如果它等待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);
      });
[...]
根控制器:

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);
  });
[...]
控制器:

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调用,那么控制器手表仍然可以工作,但是指令手表不工作。在控制台日志方面,我看到“document:”,然后“government changed”作为最后一条消息,因此在“document:”log之后没有“new val:”消息,这是我们更改文档的指示器。
另一张纸条。文档最初未定义,然后变成一个对象,将“government”设置为另一个对象,类似于{id:'ca'}。

感谢Vaidik帮助我找到答案

问题是,如果手表是在当前未定义的绑定上创建的,那么当您设置它时,它将无法工作。因此,您需要确保绑定被设置为某种东西,任何东西

在我的例子中,我设置了$scope.document={},然后绑定工作了


Angular是一种怪兽。有人能在评论中解释为什么设置$scope.document={}会让我对$scope.document.government的监视突然起作用,即使我最终完全替换了分配给$scope.document的对象(我给它一个全新的对象,我不只是设置属性)?我很困惑,因为您不可能使用常规引用来实现这一点,因为我正在为$scope.document设置一个新引用,因此Angular正在做一些其他神奇的事情,我觉得了解它在做什么可以帮助我解决未来的问题。

尝试在一个环境中重新创建,或者您可以确保在指令的控制器中应用
$watch
时,定义了
绑定
?因为如果它没有被定义为控制器中未定义的
文档
的结果,那么这将是一个问题,
$watch
将无法工作。哥们,你太棒了!我在控制器中首先将$scope.document设置为{},现在它可以工作了!