Javascript 角度超前异步结果-接收错误“;TypeError:无法使用';在';要搜索的运算符。。。在……中”;

Javascript 角度超前异步结果-接收错误“;TypeError:无法使用';在';要搜索的运算符。。。在……中”;,javascript,angularjs,asynchronous,angular-ui-bootstrap,angular-ui-typeahead,Javascript,Angularjs,Asynchronous,Angular Ui Bootstrap,Angular Ui Typeahead,我已经为一个有角度的UI typeahead字段做了一个指令。我正在尝试设计它,以便当用户键入时,它发送异步后端调用以获取结果,这些结果将填充出现的下拉列表,如中所示。但是,当我开始键入时(在本例中为“a”),会出现以下错误: TypeError: Cannot use 'in' operator to search for 'getters' in a 下面是进行REST调用的工厂方法: certFactory.getUsersWithMatchingUsername = function(

我已经为一个有角度的UI typeahead字段做了一个指令。我正在尝试设计它,以便当用户键入时,它发送异步后端调用以获取结果,这些结果将填充出现的下拉列表,如中所示。但是,当我开始键入时(在本例中为“a”),会出现以下错误:

TypeError: Cannot use 'in' operator to search for 'getters' in a
下面是进行REST调用的工厂方法:

certFactory.getUsersWithMatchingUsername = function(username) {



    return $http.get(urlBase + '/managed/user?_queryFilter=userName+co+' + '\'' + username + '\'', {timeout: timeoutLength})
        .then(function(response) {
            // success
            return response.data;
        },  function(response) {
            // error
            return $q.reject(response);
        });
};
$scope.getters = {
        getUsersWithUsername: function (username) {
            certFactory.getUsersWithMatchingUsername(username)
                .then(function (response) {
                    var users = [];
                    angular.forEach(response.result, function(item) {
                        users.push(item);
                    })
                    return users;

                },  function (error) {
                    console.log('failed!')
                })
        }
angular.module('myApp')
    .directive('dropdownsearch',  function(){
        return {
            restrict: 'E',
            transclude: true,
            scope: {
                getterFn: '&',
                config: '=', // object with properties label and type
                disabled: '=?ngDisabled',
                required: '=?ngRequred',
                ngModel: '=',
                options: '='                
            },
            require: ['^form', 'ngModel'],
            templateUrl: 'views/templates/dropdownSearchView.html',
            replace: true,

            link: function(scope, iElm, iAttrs, controller) {

             if (iAttrs.required !== undefined) {
                // If attribute required exists
                // ng-required takes a boolean
                scope.required = true;
              }

              if (iAttrs.readonly !== undefined) {
                // If attribute required exists
                // ng-required takes a boolean
                scope.readonly = true;
              }

            }

        }


    }

);
<div class="form-group has-feedback">
    <label class="control-label"> Choose {{ config.type }}></label>
    <div class="dropdown dropdown">
        <div class="input-group">

            <input 
                   type="text"
                   class="form-control"
                   placeholder="Make selection" 
                   ng-model="ngModel" 
                   uib-typeahead="option as option[config.label] for option in getterFn($viewValue)"
                   typeahead-editable="false"
                   ng-required="required"
                   ng-disabled="disabled"
                   />
        </div>
    </div>
</div>
<dropdownsearch ng-show= 'fieldMethods.showSubfield(subfield)'
 getter-fn="getters.getUsersWithUsername"
 ng-model="subsubfield.value"
 config="fieldMethods.getConfig(subfield)">
</dropdownsearch>
以下是调用工厂方法的控制器方法:

certFactory.getUsersWithMatchingUsername = function(username) {



    return $http.get(urlBase + '/managed/user?_queryFilter=userName+co+' + '\'' + username + '\'', {timeout: timeoutLength})
        .then(function(response) {
            // success
            return response.data;
        },  function(response) {
            // error
            return $q.reject(response);
        });
};
$scope.getters = {
        getUsersWithUsername: function (username) {
            certFactory.getUsersWithMatchingUsername(username)
                .then(function (response) {
                    var users = [];
                    angular.forEach(response.result, function(item) {
                        users.push(item);
                    })
                    return users;

                },  function (error) {
                    console.log('failed!')
                })
        }
angular.module('myApp')
    .directive('dropdownsearch',  function(){
        return {
            restrict: 'E',
            transclude: true,
            scope: {
                getterFn: '&',
                config: '=', // object with properties label and type
                disabled: '=?ngDisabled',
                required: '=?ngRequred',
                ngModel: '=',
                options: '='                
            },
            require: ['^form', 'ngModel'],
            templateUrl: 'views/templates/dropdownSearchView.html',
            replace: true,

            link: function(scope, iElm, iAttrs, controller) {

             if (iAttrs.required !== undefined) {
                // If attribute required exists
                // ng-required takes a boolean
                scope.required = true;
              }

              if (iAttrs.readonly !== undefined) {
                // If attribute required exists
                // ng-required takes a boolean
                scope.readonly = true;
              }

            }

        }


    }

);
<div class="form-group has-feedback">
    <label class="control-label"> Choose {{ config.type }}></label>
    <div class="dropdown dropdown">
        <div class="input-group">

            <input 
                   type="text"
                   class="form-control"
                   placeholder="Make selection" 
                   ng-model="ngModel" 
                   uib-typeahead="option as option[config.label] for option in getterFn($viewValue)"
                   typeahead-editable="false"
                   ng-required="required"
                   ng-disabled="disabled"
                   />
        </div>
    </div>
</div>
<dropdownsearch ng-show= 'fieldMethods.showSubfield(subfield)'
 getter-fn="getters.getUsersWithUsername"
 ng-model="subsubfield.value"
 config="fieldMethods.getConfig(subfield)">
</dropdownsearch>
这是我的指令

certFactory.getUsersWithMatchingUsername = function(username) {



    return $http.get(urlBase + '/managed/user?_queryFilter=userName+co+' + '\'' + username + '\'', {timeout: timeoutLength})
        .then(function(response) {
            // success
            return response.data;
        },  function(response) {
            // error
            return $q.reject(response);
        });
};
$scope.getters = {
        getUsersWithUsername: function (username) {
            certFactory.getUsersWithMatchingUsername(username)
                .then(function (response) {
                    var users = [];
                    angular.forEach(response.result, function(item) {
                        users.push(item);
                    })
                    return users;

                },  function (error) {
                    console.log('failed!')
                })
        }
angular.module('myApp')
    .directive('dropdownsearch',  function(){
        return {
            restrict: 'E',
            transclude: true,
            scope: {
                getterFn: '&',
                config: '=', // object with properties label and type
                disabled: '=?ngDisabled',
                required: '=?ngRequred',
                ngModel: '=',
                options: '='                
            },
            require: ['^form', 'ngModel'],
            templateUrl: 'views/templates/dropdownSearchView.html',
            replace: true,

            link: function(scope, iElm, iAttrs, controller) {

             if (iAttrs.required !== undefined) {
                // If attribute required exists
                // ng-required takes a boolean
                scope.required = true;
              }

              if (iAttrs.readonly !== undefined) {
                // If attribute required exists
                // ng-required takes a boolean
                scope.readonly = true;
              }

            }

        }


    }

);
<div class="form-group has-feedback">
    <label class="control-label"> Choose {{ config.type }}></label>
    <div class="dropdown dropdown">
        <div class="input-group">

            <input 
                   type="text"
                   class="form-control"
                   placeholder="Make selection" 
                   ng-model="ngModel" 
                   uib-typeahead="option as option[config.label] for option in getterFn($viewValue)"
                   typeahead-editable="false"
                   ng-required="required"
                   ng-disabled="disabled"
                   />
        </div>
    </div>
</div>
<dropdownsearch ng-show= 'fieldMethods.showSubfield(subfield)'
 getter-fn="getters.getUsersWithUsername"
 ng-model="subsubfield.value"
 config="fieldMethods.getConfig(subfield)">
</dropdownsearch>
以下是指令模板

certFactory.getUsersWithMatchingUsername = function(username) {



    return $http.get(urlBase + '/managed/user?_queryFilter=userName+co+' + '\'' + username + '\'', {timeout: timeoutLength})
        .then(function(response) {
            // success
            return response.data;
        },  function(response) {
            // error
            return $q.reject(response);
        });
};
$scope.getters = {
        getUsersWithUsername: function (username) {
            certFactory.getUsersWithMatchingUsername(username)
                .then(function (response) {
                    var users = [];
                    angular.forEach(response.result, function(item) {
                        users.push(item);
                    })
                    return users;

                },  function (error) {
                    console.log('failed!')
                })
        }
angular.module('myApp')
    .directive('dropdownsearch',  function(){
        return {
            restrict: 'E',
            transclude: true,
            scope: {
                getterFn: '&',
                config: '=', // object with properties label and type
                disabled: '=?ngDisabled',
                required: '=?ngRequred',
                ngModel: '=',
                options: '='                
            },
            require: ['^form', 'ngModel'],
            templateUrl: 'views/templates/dropdownSearchView.html',
            replace: true,

            link: function(scope, iElm, iAttrs, controller) {

             if (iAttrs.required !== undefined) {
                // If attribute required exists
                // ng-required takes a boolean
                scope.required = true;
              }

              if (iAttrs.readonly !== undefined) {
                // If attribute required exists
                // ng-required takes a boolean
                scope.readonly = true;
              }

            }

        }


    }

);
<div class="form-group has-feedback">
    <label class="control-label"> Choose {{ config.type }}></label>
    <div class="dropdown dropdown">
        <div class="input-group">

            <input 
                   type="text"
                   class="form-control"
                   placeholder="Make selection" 
                   ng-model="ngModel" 
                   uib-typeahead="option as option[config.label] for option in getterFn($viewValue)"
                   typeahead-editable="false"
                   ng-required="required"
                   ng-disabled="disabled"
                   />
        </div>
    </div>
</div>
<dropdownsearch ng-show= 'fieldMethods.showSubfield(subfield)'
 getter-fn="getters.getUsersWithUsername"
 ng-model="subsubfield.value"
 config="fieldMethods.getConfig(subfield)">
</dropdownsearch>

选择{{config.type}}>
最后,这里是我正在使用的指令

certFactory.getUsersWithMatchingUsername = function(username) {



    return $http.get(urlBase + '/managed/user?_queryFilter=userName+co+' + '\'' + username + '\'', {timeout: timeoutLength})
        .then(function(response) {
            // success
            return response.data;
        },  function(response) {
            // error
            return $q.reject(response);
        });
};
$scope.getters = {
        getUsersWithUsername: function (username) {
            certFactory.getUsersWithMatchingUsername(username)
                .then(function (response) {
                    var users = [];
                    angular.forEach(response.result, function(item) {
                        users.push(item);
                    })
                    return users;

                },  function (error) {
                    console.log('failed!')
                })
        }
angular.module('myApp')
    .directive('dropdownsearch',  function(){
        return {
            restrict: 'E',
            transclude: true,
            scope: {
                getterFn: '&',
                config: '=', // object with properties label and type
                disabled: '=?ngDisabled',
                required: '=?ngRequred',
                ngModel: '=',
                options: '='                
            },
            require: ['^form', 'ngModel'],
            templateUrl: 'views/templates/dropdownSearchView.html',
            replace: true,

            link: function(scope, iElm, iAttrs, controller) {

             if (iAttrs.required !== undefined) {
                // If attribute required exists
                // ng-required takes a boolean
                scope.required = true;
              }

              if (iAttrs.readonly !== undefined) {
                // If attribute required exists
                // ng-required takes a boolean
                scope.readonly = true;
              }

            }

        }


    }

);
<div class="form-group has-feedback">
    <label class="control-label"> Choose {{ config.type }}></label>
    <div class="dropdown dropdown">
        <div class="input-group">

            <input 
                   type="text"
                   class="form-control"
                   placeholder="Make selection" 
                   ng-model="ngModel" 
                   uib-typeahead="option as option[config.label] for option in getterFn($viewValue)"
                   typeahead-editable="false"
                   ng-required="required"
                   ng-disabled="disabled"
                   />
        </div>
    </div>
</div>
<dropdownsearch ng-show= 'fieldMethods.showSubfield(subfield)'
 getter-fn="getters.getUsersWithUsername"
 ng-model="subsubfield.value"
 config="fieldMethods.getConfig(subfield)">
</dropdownsearch>


任何帮助都将不胜感激。另外,如果需要任何其他信息,请告诉我。

UI引导网站异步Typeahead示例使用
uib Typeahead=“getLocation($viewValue)中地址的地址”
。我的猜测是,您的错误消息表示它期望指令中的
,而不是
。我不明白这一点,所以我可能是错的!:-)

UI引导网站异步Typeahead示例使用
uib Typeahead=“getLocation($viewValue)中的地址对应地址”
。我的猜测是,您的错误消息表示它期望指令中的
,而不是
。我不明白这一点,所以我可能是错的!:-)