使用Angular我创建了一个这样的指令:
angular
.module('my-module', [])
.directive('myDirective', function () {
return {
restrict: 'E',
templateUrl: currentScriptPath.replace('.js', '.html'),
scope: {
scenarios: '='
},
controller: MyDirectiveController,
controllerAs: 'vm',
bindToController: true,
replace: true
}
});
MyDirectiveController
:
MyDirectiveController.$inject = ['$scope'];
function MyDirectiveController($scope) {
var vm = this;
vm.scenarios = $scope.scenarios;
}
我的指令HTML模板是这样的:
<div>{{vm.scenarios[0].name}}</div>
在我的父视图HTML中,我以这种方式使用指令:
<my-directive scenarios="vm.scenarios"></my-directive>
父控制器有一个属性:
vm.scenarios = [] // could be [{ name : "test"}]
当$ http调用后父控制器的vm.scenarios
被设置时,当指令控制器的vm.scenarios
绑定到$scope.scenarios
并且它不绑定时,它不可用父母控制器vm.scenarios
最终填充时会更新。
将此添加到我的指令控制器时,它可以正常工作,但解决方案对我来说似乎不对:
$scope.$watch('scenarios', function(newValue) {
if (newValue !== undefined) {
vm.scenarios = $scope.scenarios;
}
});
答案 0 :(得分:1)
这是你应该如何定义指令控制器:
MyDirectiveController.$inject = [];
function MyDirectiveController() {
// nothing here
}
您不需要使用$scope
,因为您已经绑定到控制器实例this
。这意味着范围配置
scope: {
scenarios: '='
},
填充控制器实例this
对象,而不是$scope
对象,因此$scope.scenarios
为undefined
。使用控制器中的vm.scenarios = $scope.scenarios;
,您只需使用未定义的值覆盖正确的绑定。