Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 如何知道select的ngModel何时引用ngOptions中的未知选项_Angularjs - Fatal编程技术网

Angularjs 如何知道select的ngModel何时引用ngOptions中的未知选项

Angularjs 如何知道select的ngModel何时引用ngOptions中的未知选项,angularjs,Angularjs,我有两个基于公共数据集“选项”的级联下拉列表。第一个选定值过滤第二个选择中可用的选项 <label for="select1" class="control-label">Select1</label> <select name="select1" ng-model="select1" ng-options="option.select1 as option.select1 for option in options | unique: 'select1' | or

我有两个基于公共数据集“选项”的级联下拉列表。第一个选定值过滤第二个选择中可用的选项

<label for="select1" class="control-label">Select1</label>
<select name="select1" ng-model="select1" ng-options="option.select1 as option.select1 for option in options | unique: 'select1' | orderBy: 'select1'">
</select>

<label for="select2" class="control-label">Select2</label>
<select name="select2" ng-model="select2" ng-options="option.select2 as option.select2 for option in options | filter: {select1: select1} | unique: 'select2' | orderBy: 'select2'">
</select>
谢谢你的时间

编辑:

我可能过度简化了我的问题:通常有5个级联选择相互绑定。选择(n+2)取决于选择(n+1)和选择(n)。Select(n)不知道选择取决于他,例如Select(n+1,n+2,…)。表单是基于超级用户创建的表单视图模型(类似于)动态生成的


因此,在我的用例中,如果能从select2的角度判断该值是否无效,可能会更容易一些。

在第一个下拉列表中使用ng change:

<label for="select1" class="control-label">Select1</label>
<select name="select1" ng-model="select1" ng-options="option.select1 as option.select1 for option in options | unique: 'select1' | orderBy: 'select1'" ng-change="select1Changed()">
</select>

<label for="select2" class="control-label">Select2</label>
<select name="select2" ng-model="select2" ng-options="option.select2 as option.select2 for option in options | filter: {select1: select1} | unique: 'select2' | orderBy: 'select2'">
</select>

希望这有帮助。

我终于创建了一个验证指令,监视DOM、模型和选项集合的更改。当集合被修改时,我检查在视图中是否已经选择了“?”,并考虑如果它确实是未知的值。 它对于我的用例来说已经足够通用了,但是仍然缺少处理诸如“跟踪者”或适合所有用例的多个选择之类的事情。不管怎么说,我想这可能会对某人有所帮助:

.directive('known', ['$parse', function($parse) {

var NG_OPTIONS_REGEXP = /^\s*([\s\S]+?)(?:\s+as\s+([\s\S]+?))?(?:\s+group\s+by\s+([\s\S]+?))?\s+for\s+(?:([\$\w][\$\w]*)|(?:\(\s*([\$\w][\$\w]*)\s*,\s*([\$\w][\$\w]*)\s*\)))\s+in\s+([\s\S]+?)(?:\s+track\s+by\s+([\s\S]+?))?$/;

return {
    restrict: 'AC',
    require: ['select', '?ngModel'],
    link: function ($scope, $element, $attrs, ctrls) {
        var optionsExp = $attrs.ngOptions,
            modelCtrl = ctrls[1];
        if (match = optionsExp.match(NG_OPTIONS_REGEXP)) {
            var valueName = match[4] || match[6],
                keyName = match[5],
                valueFn = $parse(match[2] ? match[1] : valueName),
                valuesFn = $parse(match[7]);

            $scope.$watchCollection(valuesFn, function() {
                modelCtrl.$setValidity('unknown', !($element.val() == "?" && modelCtrl.$viewValue));
            });

            modelCtrl.$parsers.unshift(function(value) {
                // value set from view can only be a known one
                 modelCtrl.$setValidity('unknown', true);
                 return value;
            });

            modelCtrl.$formatters.unshift(function(value) {
                var values = valuesFn($scope) || [];
                var valid = false;

                for (var i = 0; i < values.length; i++) {
                    var local = {};
                    local[valueName] = values[i];
                    if (value === valueFn(local)) {
                        valid = true;
                        break;
                    }
                }

                modelCtrl.$setValidity('unknown', valid);
                return value;
            });
        }
    }
};
}]);
指令('known',['$parse',函数($parse){ (s)s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+s+]+?)?$/; 返回{ 限制:“AC”, require:['select','ngModel'], 链接:函数($scope、$element、$attrs、ctrls){ var optionexp=$attrs.ngOptions, modelCtrl=ctrls[1]; if(match=optionexp.match(NG_OPTIONS_REGEXP)){ var valueName=match[4]| | match[6], keyName=匹配[5], valueFn=$parse(匹配[2]?匹配[1]:valueName), valuesFn=$parse(匹配[7]); $scope.$watchCollection(valuesFn,function(){ modelCtrl.$setValidity('unknown',!($element.val()==“?”&&modelCtrl.$viewValue)); }); modelCtrl.$parsers.unshift(函数(值){ //视图中的值集只能是已知值 modelCtrl.$setValidity('unknown',true); 返回值; }); modelCtrl.$formatters.unshift(函数(值){ 风险值=价值fn($scope)| |[]; var-valid=false; 对于(变量i=0;i

你的权利,它应该可以完成这项工作。我尝试了一下,但如果我能从select2的角度来判断值是否不好,比如“当我的选项改变时,我会检查我的值是否好”,这对我来说会更好。我编辑我的问题,试图解释原因。
$scope.select1Changed = function () {
   // logic of known/unknown based on $scope.select1
}
.directive('known', ['$parse', function($parse) {

var NG_OPTIONS_REGEXP = /^\s*([\s\S]+?)(?:\s+as\s+([\s\S]+?))?(?:\s+group\s+by\s+([\s\S]+?))?\s+for\s+(?:([\$\w][\$\w]*)|(?:\(\s*([\$\w][\$\w]*)\s*,\s*([\$\w][\$\w]*)\s*\)))\s+in\s+([\s\S]+?)(?:\s+track\s+by\s+([\s\S]+?))?$/;

return {
    restrict: 'AC',
    require: ['select', '?ngModel'],
    link: function ($scope, $element, $attrs, ctrls) {
        var optionsExp = $attrs.ngOptions,
            modelCtrl = ctrls[1];
        if (match = optionsExp.match(NG_OPTIONS_REGEXP)) {
            var valueName = match[4] || match[6],
                keyName = match[5],
                valueFn = $parse(match[2] ? match[1] : valueName),
                valuesFn = $parse(match[7]);

            $scope.$watchCollection(valuesFn, function() {
                modelCtrl.$setValidity('unknown', !($element.val() == "?" && modelCtrl.$viewValue));
            });

            modelCtrl.$parsers.unshift(function(value) {
                // value set from view can only be a known one
                 modelCtrl.$setValidity('unknown', true);
                 return value;
            });

            modelCtrl.$formatters.unshift(function(value) {
                var values = valuesFn($scope) || [];
                var valid = false;

                for (var i = 0; i < values.length; i++) {
                    var local = {};
                    local[valueName] = values[i];
                    if (value === valueFn(local)) {
                        valid = true;
                        break;
                    }
                }

                modelCtrl.$setValidity('unknown', valid);
                return value;
            });
        }
    }
};
}]);