WinJS 绑定列表中的 IndexedDB "undefined"

IndexedDB in a WinJS Binding LIst "undefined"

好的,我已经创建了我的 IndexedDB,在创建过程中使用 'store.put' 添加了一些数据。 然后我关闭连接并重新打开连接以使用游标将数据推送到 WinJS 绑定列表:

var myData = new WinJS.Binding.List();
myData.push(cursorp.value);

现在当我 "console.log(myData);" 我得到这个:

[object Object]
myDataStore.js (70,21)
   {
      [functions]: ,
      __proto__: { },
      _binding: undefined,
      _currentKey: 1,
      _keyMap: {
         [functions]: ,
         1: {
            [functions]: ,
            __proto__: { },
            data: {
               [functions]: ,
               __proto__: { },
               theDay: "F",
               id: 1,
               listItemN: "My Note.",
               day: "1/10/2016"
            },
            handle: "1",
            key: "1"
         },
         __proto__: { }
      },
      _keys: [ ],
      _lastNotifyLength: 1,
      _listeners: null,
      _modifyingData: 0,
      _notifyId: 0,
      _pendingNotifications: null,
      _proxy: undefined,
      dataSource: { },
      length: 1,
      onitemchanged: undefined,
      oniteminserted: undefined,
      onitemmoved: undefined,
      onitemmutated: undefined,
      onitemremoved: undefined,
      onreload: undefined
   }

当我尝试执行 ListView 时,我得到了其中包含 "undefined" 的列表元素。我已经改变了它,这样我就可以得到我想要的所有三个项目:

myData.push(cursorp.value.listItemN, cursorp.value.theDay, cursorp.value.day);

但它做同样的事情,每个元素里面都有 "undefined"。

我只是不知道如何从此绑定列表中提取数据。

这是我正在创建的模板。它通过命名空间从另一个js文件中获取数据的值:

    var myListDataInfo = myOwnNamespce.itemList;

    var myTemp = (function myTemplate(myPromise) {
      return myPromise.then(function(listNote) {
        var div = document.createElement("div");
        div.className = "myListContainer";

        var myListNote = document.createElement("h4");
        myListNote.innerText = listNote.myListDataInfo;
        div.appendChild(myListNote);

        return div;
      })
    });

如有任何帮助,我们将不胜感激。 -Rob0

这就是事情无法正常工作的原因:

  1. 我需要一个回调函数来确保:
var myData = new WinJS.Binding.List();

已处理,然后创建命名空间:

var myData = new WinJS.Binding.List();

        function loadData(callback) {
          //Open new instance of DB
          var myDataBase = indexedDB.open("notelist");

          myDataBase.onsuccess = function(e) {
            var list = e.target.result.transaction("notes", "readwrite");
            var myStore = list.objectStore("notes");
            myStore.openCursor().onsuccess = function(e) {

              var cursorp = e.target.result;
              if (cursorp) {
                myData.push(cursorp.value);
                cursor.continue();
              } else {
                console.log(myData);
                console.log("Gathered Array!");

                if (typeof callback === "function") {

                  callback();

                }
              };

            };

          };
        };

        function createMyNameSpace() {
            WinJS.Namespace.define('myOwnNamespce', {

              itemList: myData,

            });
        };

为了使回调工作,我将函数(回调)放在我的 onsuccess 中以创建数据库。

        myDat.onsuccess = function () {
            myLDat = myDat.result;
            loadData(createMyNameSpace);

            console.log("Database initialized!");
        };
  1. 我对模板的有限理解在这里发挥了作用。我发现 this link 很有帮助。

如果您查看上面的模板代码,您可能会发现我正在做的是尝试获取已经通过尝试未定义的方法获取的数据。所以模板现在看起来像这样:

    var myListDataInfo = myOwnNamespce.itemList; //This is not needed

    var myTemp = (function myTemplate(myPromise) {
      return myPromise.then(function(listNote) {
        var div = document.createElement("div");
        div.className = "myListContainer";

        var myListNote = document.createElement("h4");
        myListNote.innerText = listNote.data.listItemN; //The change is in this line.
        div.appendChild(myListNote);

        return div;
      })
    });

我还发现 this 文章有助于理解回调。

希望对您有所帮助。

编辑更新

添加了 var myData = new WinJS.Binding.List();到代码。会注意到代码在匿名函数内部。

编辑更新