[英]Pass variables to a dynamic Controller inside a Directive AngularJS
我得到了一个指令,该指令根据传递给它的变量类型 加载不同的模板 。 我也将变量耐心和服务传递给指令的隔离范围。
.directive('serviceCharts', serviceCharts);
function serviceCharts() {
return {
restrict: 'E',
link: function (scope, element, attrs) {
if(attrs.type) {
scope.template = 'views/' + type + '.html';
}
attrs.$observe('type', function (type) {
if(attrs.type) {
scope.template = 'views/' + type + '.html';
}
});
},
template: '<div ng-include="template"></div>',
scope:{
patient:'=',
service:'='
}
};
}
在模板中 (例如,views / myservice.html),我加载了控制器 :
<div ng-controller="myCtrl as vm">
VIEW
</div>
在控制器(myCtrl)中,我以这种方式访问 患者并进行服务 :
service = $scope.$parent.$parent.service;
patient = $scope.$parent.$parent.patient;
这工作正常,但我不喜欢这种通过$ parent。$ parent访问变量的方式。 这也弄乱了我的测试。
还有另一种(更好)的方法吗?
谢谢!
您可以为patient
和service
属性创建包装对象。 可以将其命名为model
,然后将该模型对象提供给您的指令。
然后,当前方法的问题是, ng-include
为其创建template
的子范围。 因此,如将传递的原始类型对象绑定到指令一样,如果要在子作用域中更改任何子原始类型绑定。 它失去了绑定,这就是为什么倾向于使用$parent.$parent
符号完全绑定到原始源对象的原因。
$scope.model = {
patient:'My Patient',
service:'My Service'
};
通过创建上述对象结构,可以确保您遵循Dot Rule
。 Dot Rule
将避免$parent.$parent
显式范围注释。
指令范围绑定将更改为以下
scope:{
model:'='
}
指令用法如下所示
<service-charts type="{{'sometype'}}" model="model"></service-charts>
除了点规则以外,针对这种范围界定问题的另一种选择是遵循controllerAs
模式。 但是接下来,您bindToController: true
controllerAs
使用隔离scope
,因此应将bindToController: true
选项设置为true,以确保将所有scope
合并到控制器上下文中。
scope:{
patient:'=',
service:'='
},
controllerAs: '$ctrl',
bindToController: true
然后在每个指令作用域变量之前使用$ctrl
。
是的,有更好的方法可以做到这一点。 您应该使用services
并将变量存储在这些服务中(在这种情况下,您应该创建一个工厂来存储数据)。 然后,您可以注入这些服务并访问其数据。
旁注:您可以在指令中使用{ ..., controller: 'controllerName', controllerAs: 'vm' }
语法,因此您无需在html中声明它们。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.