2011-08-19 89 views
1

我很新的javascript。我下载了一些代码来为搜索框创建一个自动完成器,但它并没有像我期望的那样工作。通过引用传递/存储数组?

这是我下载的代码:

Autocompleter.Local = new Class({ 

    Extends: Autocompleter, 

    initialize: function (element, tokens, options) { 
     this.parent(element, options); 
     console.log(tokens); // I added this 
     this.tokens = tokens; 
    }, 

    query: function() { 
     console.log(this.tokens); // and this 
     this.update(this.filter()); 
    } 

}); 

要使用该代码的,我这样做:

var Activities = ['aa', 'bb', 'cc', 'abcd']; 

function InitializePage() { 

    new Autocompleter.Local('txtSearch', Activities, { 
     'minLength': 1, // We wait for at least one character 
     'overflow': false, // Overflow for more entries 
     'selectMode': 'type-ahead' 
    }); 
} 

window.addEvent('domready', function() { 
    InitializePage(); 
}); 

tokens参数初始化功能是所有的数组autocompleter可能会提出的可能的事情。 filter()函数对这些进行过滤,以便仅向用户显示相关的内容。我想要做的是在不同的时间更改tokens阵列,以便向用户建议不同的事情。

我试着这样做:

new Request.JSON({ method: 'get', url: 'handler/GetActivities.ashx', autoCancel: true, urlEncoded: false, secure: false, 
    headers: { "Content-type": "application/json" }, 
    onSuccess: function (_json, _jsonText) { 
     Activities = _json; 
    } 
}).send(); 

我已经证实,Activities变量是由该请求更新。但是,autocompleter类中的tokens变量仍然是初始化为的数组。

我该如何得到它以便tokens变量指向与activities变量相同的数据?

回答

1

问题是你重写数组。您应该替换元素。你可以用splice[MDN]添加和删除就地元素:

Activities.splice(0, Activities.length, _json[0], _json[1], ...); 

这将删除所有元素(从0Activities.length),并从_json阵列添加每个元素。

_json可能包含未知数量的元素,并且像上面所做的那样硬编码它非常糟糕。幸运的是,我们可以使用apply[MDN]方法调用方法具有可变数量的参数,如阵列提供:

var params = [0, Activities.length].concat(_json); 
Activities.splice.apply(Activities, params); 

这是等效于上面的呼叫,而是从加入_json所有元素。

参考:concatspliceapply

+0

谢谢。我以完全错误的方式看待这个问题。我不得不盯着拼接/应用的东西10分钟来解决那里发生的事情! – Oliver

+0

@Oliver:不客气:) FWIW,我现在解释得好一点。 –