在AngularJS中使用$ scope。$ watch来创建对象之间的依赖关系?

时间:2017-02-02 17:23:58

标签: angularjs

vm.Parameters 是参数对象的列表(vm是控制器的别名)。

每个参数至少具有这3个属性(为了简单起见):

  • param.Name
  • param.Dependensies
  • param.Values

参数可能依赖于另一个参数,例如,我们有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函数的第一个参数应该是什么。

感谢任何帮助。

1 个答案:

答案 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语法的进一步可读性,但它不是必需的。