我有这个指令,可以更改父$scope
中的$scope.mode
:
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>
子视图模板.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和子视图模板使用的控制器.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 上不起作用。 $watch
内部console.log
打印正确的值。
有什么帮助吗?我在这里做错了什么?
您正在初始化 ctrl 控制器的新实例。删除该行,它将使用父控制器,该控制器将是ctrl。例如:
'sub': {
templateUrl: 'subviewTemplate.html'
}