vm.Parameters 是参数对象的列表(vm是控制器的别名)。
每个参数至少具有这3个属性(为了简单起见):
参数可能依赖于另一个参数,例如,我们有3个参数(Country,Region和City)。
地区取决于国家/地区,城市取决于地区和国家/地区,如下所示:
vm.Parameters['Region'].Dependencies = ['Country'];
vm.Parameters['City'].Dependencies = ['Country', 'Region'];
当我渲染UI时,我会为每个参数生成下拉列表 选择国家/地区后,我需要使用所选国家/地区的区域填充“区域”下拉列表 选择区域时,我需要使用选定区域和国家/地区的城市填充城市下拉列表。
问题我想知道是否可以使用$ scope。$ watch 以便每个子参数都会监视父参数的变化(param.Values属性) ),在param.Dependencies中列出。
我不确定应该如何实施。
我将此函数添加到控制器,它循环遍历列表中的所有参数,并且对于每个参数,它循环所有依赖项(此参数所依赖的父参数的名称,如城市的国家和地区)
cascadeReportParameters() {
for (let param of this.reportParameters) {
for (let parentParam of param.Dependencies) {
this.$scope.$watch(parentParam, function (newValue, oldValue) {
this.getDependentParameterValues(param);
});
};
}
}
此功能无效。
根据文档,第一个参数是被监视的控制器属性的字符串名称。
所以,如果我有一个属性Property1
,我可以写
这个。$ scope。$ watch('Property1',function(newValue,oldValue){}
但是在我的情况下,我需要注意参数['SomeName']。值,我不知道如何设置这个手表。我不确定$ watch函数的第一个参数应该是什么。
感谢任何帮助。
答案 0 :(得分:0)
以这种方式使用时,$watch
需要一个scope
变量。请注意此示例中的字符串表示法:
$scope.somevariable = 1;
$scope.$watch('somevariable', function(vNew, vOld) {
alert('somevariable has changed');
});
但你可以看一个功能。在观看某个功能时,手表会设置在功能的返回值上,该值可以是任何内容,也不需要是范围变量:
$scope.$watch(function(){
// return whatever value you'd like to watch
return Parameters['SomeName'].Values;
}, function(vNew, vOld) {
alert('The watch value has changed');
});
希望有所帮助。请注意,每个摘要将多次调用函数监视,这可能会产生性能问题。
编辑:这个答案:add watch on a non scope variable in angularjs还显示了一种绑定语法,可能有助于controllerAs
语法的进一步可读性,但它不是必需的。