watch在控制器上触发,但不是指令

时间:2014-07-04 16:54:56

标签: angularjs

我有一个监视绑定的指令,奇怪的是,如果变量立即更改,手表会关闭,但如果它等到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;}。

1 个答案:

答案 0 :(得分:1)

感谢Vaidik帮助我找到答案。

问题是如果在当前未定义的绑定上创建了监视,那么当您设置它时,它将无法工作。所以你需要确保将绑定设置为某种东西。

在我的情况下,我设置$ scope.document = {},然后绑定工作。

Angular是一个奇怪的野兽。任何人都可以在评论中解释为什么设置$ scope.document = {},允许我的$ scope.document.government手表突然工作,即使我最终完全替换了分配给$ scope.document的对象(我给它是一个全新的对象,我不只是设置属性)?我很困惑,因为你不可能通过常规引用来做到这一点,因为我为$ scope.document设置了一个新的引用,所以Angular正在做一些神奇的事情,我感觉到了它所做的事情可以帮助我解决未来的问题。