根据传递给它的变量 type ,我得到了加载不同模板的指令。我也将变量患者和服务转移到指令的孤立范围。
.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访问变量的方式。这也搞砸了我的测试。
还有其他(更好)的方法吗?
谢谢!
答案 0 :(得分:1)
您可以为patient
&amp;创建一个包装器对象。 service
属性。这可以命名为model
&amp;然后将该模型对象提供给您的指令。
然后,当前方法的问题是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
模式。但是,当您要使用scope
与controllerAs
隔离时,您应该将bindToController: true
选项设置为true,以确保将所有scope
合并到控制器上下文中。
scope:{
patient:'=',
service:'='
},
controllerAs: '$ctrl',
bindToController: true
然后在每个指令范围变量之前使用$ctrl
。
答案 1 :(得分:0)
是的,有更好的方法可以做到这一点。您应该使用services
并在这些服务中存储变量(在您的情况下,您应该创建一个用于存储数据的工厂)。然后,您可以注入这些服务并访问其数据。
<强>旁注:强>
您可以在指令中使用{ ..., controller: 'controllerName', controllerAs: 'vm' }
语法,这样就不需要在html中声明这些语法。