【问题标题】:Input with autocomplete jquery and Odoo rpc call don't show suggestions使用自动完成 jquery 和 Odoo rpc 调用的输入不显示建议
【发布时间】:2018-12-06 00:20:38
【问题描述】:

当用户仍然按键时,我想使用 jquery 自动完成从后端加载数据。 我看到 site 使用 ajax 调用进行自动完成。

这是我正在使用的代码,但我对结果感到困惑。 我不明白自动完成如何收回 odoo rpc 结果并在输入表单中显示它

<label class="control-label" for="timesheet_user_id">Employee:
</label>
<input id="employee_name"/>

和 jquery 自动完成

  var employee_name = $('#employee_name');
    employee_name.autocomplete({
        source: function (request, response) {
           ajax.jsonRpc("/employee_search", "call", {"name": employee_name.val()})
                .then(function (data) {
                   response(data);
                   console.debug(response);
                });
        },
        onSelect: function (suggestion) {
            alert('You selected: ' + suggestion.value + ', ' + suggestion.data);
        }
    });

通过控制台,我看到我收到了对象数组,但 html 上没有任何反应。

可能是数据类型错误或我如何进行 rpc 调用?

后端功能:

@http.route("/employee_search", type="json",
            auth="public", website=True)
def employee_search(self, name):

    employee_objs = request.env["hr.employee"] \
        .sudo().search([("name", "ilike", name)])

    if not employee_objs:
        return {"fail": True}

    suggestions = []
    for employee in employee_objs:
        employee_vals = {}
        employee_vals['value'] = employee.id
        employee_vals['data'] = employee.name
        suggestions.append(employee_vals)

    # make a dict of dicts with employees values
    return suggestions

编辑

修改成jquery自动补全response = data;with

.then(function (data) {
       response(data);
       console.debug(response);
});

现在输入显示两个小框,里面没有文字。 输入框后仍然没有显示从rpc调用接收到的数据

EDIT2

问题是source:,因为如果我传递一个静态对象数组,我可以看到它们,但是这个调用没有任何事情发生......我哪里错了?

employee_name.autocomplete({
            source: function (request, response) {
               ajax.jsonRpc("/employee_search", "call", {"name": employee_name.val()})
                    .then(function (data) {
                       response(data);
                       console.debug(response);
                    });
            }
        });

数据包含值数组,但源不捕获它们。

【问题讨论】:

    标签: javascript jquery autocomplete


    【解决方案1】:

    好的,我终于写了一个代码,用于实时搜索并提供建议:

    这里是 JS:

    /*Autocomplete that suggest input*/
        var serial_number = $('#searchSerial');
        serial_number.autocomplete({
            minLength: 3,
            source: function (request, response) {
                ajax.jsonRpc("/serial_search", "call", {"serial": serial_number.val()})
                    .then(function (data) {
                        console.debug(data);
                        if (data.fail) {
                            // if SN was not found in the db alert the user
                            // This is non blocking, the user can still compile the form
                            //alert(_t("Serial Number not found in the system, please fill the form manually"));
                            serial_number.addClass('error_input');
                        } else {
                            serial_number.removeClass('error_input');
                            response(data);
                        }
                    });
            },
            //If the record return is only one auto select it
            response: function (event, ui) {
                if (ui.content.length === 1) {
                    ui.item = ui.content[0];
                    serial_number.val(ui.item.value);
                    serial_number.data('ui-autocomplete')._trigger('select', 'autocompleteselect', ui);
                    serial_number.autocomplete('close');
                }
            },
            select: function (event, ui) {
                let brand_id = $("input[name='brand_id']");
                let brand_name = $("input[name='brand_name']");
                let product_id = $("input[name='product_id']");
                let product_name = $("input[name='product_name']");
                let serial_number = $("input[name='serial_number']");
    
                brand_id.val(ui.item.brand_id);
                brand_name.val(ui.item.brand_name);
                product_id.val(ui.item.product_id);
                product_name.val(ui.item.product_name);
                serial_number.val(ui.item.serial_number);
            }
        });
    

    Javascript 代码在用户输入至少 3 个字母时进行搜索,如果只有一个记录匹配大小写,则由response: 自动选择。 当用户在建议列表中选择某个声音时,selected: 案例会填充其他输入字段。

    这里是返回建议数据的控制器:

      @http.route("/serial_search", type="json",
                    auth="public", website=True)
        def serial_search(self, serial):
            """
            Starting from a serial number (portal user input),
            serach for the corresponding lot and then search
            for product id/name and brand id/name.
            Return them to the website form.
            """
            serial_domain = [("name", "ilike", serial)]
    
            serial_objs = request.env["stock.production.lot"] \
                .sudo().search(serial_domain, limit=10)
    
            if not serial_objs:
                return {"fail": True}
    
            suggestions = []
            for serial_obj in serial_objs:
                serial_vals = {}
                serial_vals['data'] = serial_obj.product_id.id
                serial_vals['value'] = serial_obj.name
    
                serial_vals['product_id'] = serial_obj.product_id.id
                serial_vals['product_name'] = '%s - %s' % (
                    serial_obj.product_id.default_code, serial_obj.product_id.name)
                serial_vals['brand_id'] = serial_obj.product_id.product_brand_id.id
                serial_vals['brand_name'] = serial_obj.product_id.product_brand_id.name
                serial_vals['serial_number'] = serial_obj.name
    
                suggestions.append(serial_vals)
    
            # make a list of dicts with serial number values
            return suggestions
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-21
      • 2018-04-27
      • 2011-06-08
      • 1970-01-01
      • 1970-01-01
      • 2016-09-22
      相关资源
      最近更新 更多