2016-04-27 4 views
0

У меня есть эта директива, которая изменяет $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, а также Ui ракурса, загружающий подтаблицы:

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

и контроллер, используемый как основной. 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

'return scope.mode = newMode;' нет необходимости в этом, это уже сделано. Вам не нужно смотреть на него так, поскольку двусторонняя привязка с '=' уже занимается обновлением вашей области. Кроме того, почему у вас одинаковый ctrl для всех ваших просмотров? Они не получат тот же экземпляр $ scope, поэтому то, что будет работать в одном контроллере, не будет работать на другом. Это связано с тем, что каждый вид получит свой собственный экземпляр $ scope, в отличие от других вещей, $ scope не является одиночным, только $ rootScope. – Walfrat

+0

Несмотря на то, что subview, если не создан контроллер или область видимости, использует ту же родительскую область (что, я думаю, это так, поскольку я могу правильно использовать текущее значение в subviewTemplate.html). Я удалил как обратный, так и второй $ watch, кстати, спасибо, указав это – Nick

ответ

1

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

'sub': { 
    templateUrl: 'subviewTemplate.html' 
} 
+0

, что вы имеете в виду контроллер? – Nick

+0

Да. Удалено, и теперь оно работает. Большое спасибо. – Nick

+0

Да. Если вы не укажете контроллер, вы можете использовать родительский контроллер. Обычно лучше всего иметь различный контроллер для каждого вида (если вам не нужен он, как в вашем случае выше). Если вы хотите поделиться данными между контроллерами, используйте службу. – carlcheel