ng-repeat控制器和父更新

时间:2014-08-21 21:14:06

标签: javascript angularjs angularjs-ng-repeat

我一直在阅读有关角度范围和继承的很多内容,但我无法理解这个问题。这是我正在使用的HTML:

<div class="sensorquery-sensor" ng-repeat="sensor in query.sensors" ng-controller="SensorsCtrl">
    <select class="form-control"
            ng-model="selected.sensor"
            ng-options="sensor.name for sensor in parameters.sensors">
    </select>
    <select class="form-control"
            ng-model="selected.definition"
            ng-options="definition.value for definition in definitions">
    </select>
    <select class="form-control"
            ng-model="selected.operation"
            ng-options="operation for operation in operations">
    </select>
</div>

如您所见,我有ng-repeat基于query.sensors。存储在此query.sensors数组中的值应该很简单:

{
    name: 'sensor1',
    type: 'temperature'
}

但我想使用子控制器:SensorsCtrl来处理每个传感器的更多逻辑并隐藏传感器的复杂性。传感器看起来像:

{
    name: 'sensor1',
    attributes: [
        'model',
        'brand'
    ],
    definitions: [
        {
            datatype: 'double',
            value: 'temperature'
        },
        {
            datatype: 'integer',
            value: 'pressure'
        },
        {
            datatype: 'string',
            value: 'color'
        }
    ]
}

所以它在我的SensorsCtrl控制器中,我想放置选择逻辑:

$scope.$watch('selected.sensor', function(sensor) {
    $scope.definitions = sensor.template.definition; 
});

$scope.$watch('selected.definition', function(definition) {
    if (definition.datatype === 'string') {
        $scope.operations = ['Count'];
    } else {
        $scope.operations = ['Max', 'Min'];
    }

    $scope.selected.operation = _.first($scope.operations);
});

当用户选择不同的传感器和定义时,如何在转换传感器时保持与父query.sensors[$index]的链接?

selected上设置观察程序并更新query.sensors数组会触发无限$digest循环。

1 个答案:

答案 0 :(得分:0)

我找到了正确的解决方案:

<div class="sensorquery-sensor" ng-repeat="sensor in query.sensors" ng-controller="SensorsCtrl">
    <!-- ... -->
</div>

sensor是对父query.sensors的原始对象的引用。它是在子控制器范围内创建的。

所以在我的SensorsCtrl控制器中,我只能看:

$scope.$watch('sensor.definition', function(definition) {
    /* ... */
});

所以我可以在这个控制器中隐藏一些复杂性,同时保持与原始元素的正确链接。

它没有回答维持一个不太复杂的对象的问题,但我认为这是一个不同的问题。