Невозможно установить свойство 'url' из неопределенного - PullRequest
3 голосов
/ 27 марта 2020

В приведенном ниже примере я создаю экземпляр класса typeahead

    var ta = $.typeahead({
        input: '.super',
        minLength: 0,
        maxItem: 15,
        order: "asc",
        hint: true,
        href: "",
        searchOnFocus: true,
        display: ["name"],
        template: "{{name}}",
        source: {
            "SearchResults": {
                //ajax: {
                //    url: "/search/" + id,
                //    path: ""
                //}
            }
        },
        callback: {
            onClickAfter: function (node, a, item, event) {
                event.preventDefault;
                debugger;
            }
        },
        debug: true
    });

Позже, используя переменную id, полученную с помощью следующего метода

    $("input").focus(function () { 
        id = $(this).attr("id");
        ta.source.ajax.url = "/search/" + id;
    }); 

я получаю Cannot set property 'url' of undefined, поскольку ta.source.ajax фактически нулевой. Как я могу это исправить?

Проще говоря, я не хочу создавать дубликаты кода для каждого ввода в моей форме

Ответы [ 4 ]

2 голосов
/ 02 апреля 2020

Настроить SearchResults группировать через options свойство экземпляра Typeahead.

source свойство экземпляра Typeahead генерируется из options.

ta.options.source.SearchResults.ajax.url = "/search/" + id;
0 голосов
/ 08 апреля 2020

Как насчет простого переноса строки в операторе if, проверяющем, существует ли ta.source.ajax, чтобы предотвратить сброс свойства нулевой ошибки

if(ta.source.ajax){
   ta.source.ajax.url = "/search/" + id;
}
0 голосов
/ 05 апреля 2020

Возможно, вы используете какую-то библиотеку jQuery. но если его загрузка и инициализация вашей переменной правильно. и вы получаете все остальное имущество, тогда это небольшая проблема. Давайте обсудим возможный случай и разберемся с проблемой

    var ta = $.typeahead({
            input: '.super',
            minLength: 0,
            maxItem: 15,
            order: "asc",
            hint: true,
            href: "",
            searchOnFocus: true,
            display: ["name"],
            template: "{{name}}",
            source: {
                "SearchResults": {
                    //ajax: {
                    //    url: "/search/" + id,
                    //    path: ""
                    //}
                }
            },
            callback: {
                onClickAfter: function (node, a, item, event) {
                    event.preventDefault;
                    debugger;
                }
            },
            debug: true
        });

, когда вы назначаете что-либо в переменную "ta", возможно, вы получаете все свойство. но вы получаете сообщение об ошибке «Невозможно установить свойство« URL »из неопределенного». Таким образом, четко упоминается свойство, которое вы пытаетесь использовать, это URL. логически это должно быть ajax свойство, но ajax само не определено в вашей переменной. Поэтому вы должны сначала определить ajax.

var ta = $.typeahead({
            input: '.super',
            minLength: 0,
            maxItem: 15,
            order: "asc",
            hint: true,
            href: "",
            searchOnFocus: true,
            display: ["name"],
            template: "{{name}}",
            source: {
                "SearchResults": {
                    ajax: { // now ajax is defined and you will not get any error. 
                    }
                }
            },
            callback: {
                onClickAfter: function (node, a, item, event) {
                    event.preventDefault;
                    debugger;
                }
            },
            debug: true
        });

Всегда проверяйте, что переменная JSON определена ранее, вы можете определить свойство позже.

например

var a={}
a.b.c=10
console.log(a.b.c)// you will get same error.

но если вы используете что-то вроде ниже.

a.b={}
a.b.c=10 
console.log(a.b.c)// you will not get an error.

надеюсь, это поможет вам.

0 голосов
/ 04 апреля 2020

Я думаю, вам следует использовать ta.source.SearchResults.ajax.url вместо ta.source.ajax.url, как предложено @ freedomn

$("input").focus(function () { 
    id = $(this).attr("id");
    ta.source.SearchResults.ajax.url = "/search/" + id;
}); 

Кроме того, @OrElse о вашей ошибке, попробуйте оставить свойства пустыми и не комментировать их вне. Плюс попробуйте удалить двойные кавычки из SearchResults -

source: {
    SearchResults: {
        ajax: {
            url: "/search/" + id,
            path: ""
        }
    }
},
...