$watch не обновляет подпредставление

У меня есть эта директива, которая меняет $scope.mode в родительском $scope:

angular.module('Selector', []).directive('mySelector', function() {
  var changeMode;
  changeMode = function(newmode) {
    var $scope;
    $scope = this;
    $scope.mode = newmode;
    $('.menu-open').attr('checked', false);
    return $scope.mode;
  };
  return {
    restrict: 'E',
    scope: {
      mode: '=mode',
      id: '@id'
    },
    replace: true,
    templateUrl: './directives/modeSelector/Selector.tpl.html',
    link: function(scope, element, attrs) {
      scope.changeZoneMode = changeMode;
      return scope.$watch((function() {
        return scope.mode;
      }), function(newMode) {
        return scope.mode = newMode;
      });
    }
  };
});

эта директива включена в main.html, а также в пользовательский интерфейс, который загружает подпредставление:

 <my-selector mode="current.Mode" id="{{current.ID}}"></my-selector>
 <!-- This binding works and updates properly -->
 {{current.Mode}}

 <!-- Subview container -->
 <div ui-view="sub"></div>

subviewTemplate.html:

<!-- This binding doesn't work! -->
{{current.Mode}}

у подпредставления нет определенного контроллера, и он использует родительский, как в настройках app.js:

.state('app.details', {
  name: 'appDetails',
  url: '/:zoneID',
  views: {
    'appContent': {
      templateUrl: 'main.html',
      controller: 'ctrl'
    }
  }
}).state('app.details.overview', {
  name: 'appDetailsOverview',
  url: '/details',
  views: {
    'appContent': {
      templateUrl: 'main.html',
      controller: 'ctrl'
    },
    'sub': {
      templateUrl: 'subviewTemplate.html',
      controller: 'ctrl'
    }
  }
});

и контроллер, используемый как main.html, так и subviewTemplate.html:

angular.module('myController', ['services']).controller('ctrl', [
  '$scope', 'Data', function($scope, Data) {

    $scope.current = new Data;
    $scope.current.load();

    return $scope.$watch('current.Mode', (function(newValue, oldValue) {
      console.log('Old value is: ' + oldValue);
      $scope.current.Mode = newValue;
      return console.log('new value is: ' + $scope.currentMode);
    }), true);
  }
]);

Я не понимаю, почему он работает на main.html, обновляя должным образом, но не на subviewTemplate.html. console.log внутри $watch печатает правильное значение.

Любая помощь? Что я здесь не так делаю?

1 ответ

Решение

Вы инициализируете новый экземпляр контроллера Ctrl. Удалите эту строку, и он будет использовать родительский контроллер, который будет Ctrl. Например:

'sub': {
    templateUrl: 'subviewTemplate.html'
}
Другие вопросы по тегам