2013-03-02 4 views
1

У меня есть приложение WinRT/javaScript, в котором я использую список. В качестве теста у меня есть следующий код:WinJS.Binding.List - значение ключа не найдено

var testList = new WinJS.Binding.List(); 
var item = { 
    key: "mykey", 
    value: "hello", 
    value2: "world" 
}; 

testList.push(item); 

var foundItem = testList.getItemFromKey("mykey"); 

Я ожидаю, что найду свой товар с помощью прилагаемого ключа; однако foundItem всегда возвращается не определено. Есть ли что-то, что я делаю неправильно в настройке и использовании моего списка?

Кроме того, когда я просматриваю свой список во время отладки, я вижу, что ключ для элемента, который я нажимаю, это «1» вместо «mykey».

ответ

1

То, что вы нажимаете, является значением объекта в списке, ключ присваивается внутренне как увеличивающееся целочисленное значение. Если вы закроете base.js в справочной системе Windows Library for JavaScript 1.0 в своем проекте, вы увидите следующую реализацию для push.

Обратите внимание на звонок this._assignKey(). Это значение возвращается к вам в oniteminserted обработчиком

push: function (value) { 
    /// <signature helpKeyword="WinJS.Binding.List.push"> 
    /// <summary locid="WinJS.Binding.List.push"> 
    /// Appends new element(s) to a list, and returns the new length of the list. 
    /// </summary> 
    /// <param name="value" type="Object" parameterArray="true" locid="WinJS.Binding.List.push_p:value">The element to insert at the end of the list.</param> 
    /// <returns type="Number" integer="true" locid="WinJS.Binding.List.push_returnValue">The new length of the list.</returns> 
    /// </signature> 
    this._initializeKeys(); 
    var length = arguments.length; 
    for (var i = 0; i < length; i++) { 
     var item = arguments[i]; 
     if (this._binding) { 
      item = WinJS.Binding.as(item); 
     } 
     var key = this._assignKey(); 
     this._keys.push(key); 
     if (this._data) { 
      this._modifyingData++; 
      try { 
       this._data.push(arguments[i]) 
      } finally { 
       this._modifyingData--; 
      } 
     } 
     this._keyMap[key] = { handle: key, key: key, data: item }; 
     this._notifyItemInserted(key, this._keys.length - 1, item); 
    } 
    return this.length; 
}, 

поэтому при добавлении следующей строки в коде, вы получите значение, которое вы могли бы использовать позже (если вы связать его с «ключом» вас толкнул).

testList.oniteminserted = function (e) { 
    var newKey = e.detail.key; 
}; 
Смежные вопросы