0

我有一个 AngularJS 1.5 组件,它代表一个带有 ng-options 的选择下拉菜单。具体来说,这些 ng-options 由不同的数据(来自常量文件)动态填充,具体取决于绑定到组件的 name 属性的值,它来自父控制器。
例如,我的组件如下所示:

test.component.js

angular
    .module('test.component')
    .component('Selector', {
        controller: Selector,
        controllerAs: 'vm',
        templateUrl: 'selector.html',
        bindings: {
            model: '=',
            form: '<',
            name:'@',
            label:'@',
            constant: '<',
        }
    });
    function Selector(CONSTANTS, SOME_OTHER_CONSTANTS) {
        var vm = this;
        switch(vm.name) {
            case 'Name1':
            vm.constant = CONSTANTS;
            break;

            case 'Name2' :
            vm.constant = SOME_OTHER_CONSTANTS;
            break;
        }

    }

所以在父控制器的视图中是这样的:
parent-view.html

<selector
  name="Name1"
  form="vm.myForm"
  model="vm.myModel>
</selector>

它工作得很好,但通过属性区分父控制器和数据可能不是一个好主意,name因为它主要用于表单验证。为了区分父控制器以便能够将不同的数据填充到 ng-options 中,最好使用什么?

任何帮助和建议将不胜感激。

4

1 回答 1

1

如果您只有 2 个这些常量 - 使用 if 似乎没问题,如果您有 20 个不同的常量,您可以使用注入器:

function Selector($injector) {
        var vm = this;
        vm.constant  = $injector.get(constantProvider);    
    }

<selector
  constant-provider="SOME_OTHER_CONSTANTS"
  form="vm.myForm"
  model="vm.myModel>
</selector>

如果您有多个地方要按名称寻址常量,则可以尝试创建单独的工厂来存储所有这些小常量:

module.factory('MyConstants', function(CONSTANTS, SOME_OTHER_CONSTANTS) {
  return {
    name1: CONSTANTS, name2: SOME_OTHER_CONSTANTS
  }
});
于 2017-09-25T17:27:39.533 回答