2013-10-31 123 views
0

我正在使用Windows 8.1 winJS,並嘗試從indexedb填充listView並且無法使其工作。 我從jsonStr第76行得到一個字符串,但我無法綁定到html。從Indexdb填充ListView

我的JavaScript

(function() { 

"use strict"; 

var nav = WinJS.Navigation; 
var session = WinJS.Application.sessionState; 
var util = WinJS.Utilities; 

WinJS.Namespace.define("DataExampleA", 
    { 
     itemList: new WinJS.Binding.List() 
    }) 

var plantsData1 = [ 

{ id: 1, title: "Banana blast1", text: "Ice cream", picture: "images/plants/Acalypha pendula.jpg" }, 
{ id: 2, title: "Banana blast2", text: "Ice cream", picture: "images/plants/Acalypha pendula.jpg" }, 
{ id: 3, title: "Banana blast3", text: "Ice cream", picture: "images/plants/Acalypha pendula.jpg" } 
]; 

var indexedDB = window.msIndexedDB; 
var IDBTransaction = window.IDBTransaction; 

if (!window.indexedDB) { 
    window.console.log("Your browser doesn't support a stable version of IndexedDB.") 
} 

var db; 
var request = window.msIndexedDB.open("plantsDatabase", 1); 

request.onerror = function (event) { 
    console.log("error: "); 
}; 

request.onsuccess = function (event) { 
    db = request.result; 
    console.log("success: " + db); 
}; 

request.onupgradeneeded = function (event) { 
    console.log('Creating object stores'); 
    var db = event.target.result; 
    var objectStore = db.createObjectStore("plantsStore", { keyPath: "id" }); 
    for (var i in plantsData1) { 
     objectStore.add(plantsData1[i]); 
    } 
} 

function read() { 
    var transaction = db.transaction(["plantsStore"]); 
    var objectStore = transaction.objectStore("plantsStore"); 
    var request = objectStore.get("00-03"); 
    request.onerror = function (event) { 
     console.log("Unable to retrieve daa from database!"); 
    }; 
    request.onsuccess = function (event) { 
     // Do something with the request.result! 
     if (request.result) { 

      // console.log("Name: " + request.result.name + ", Age: " + request.result.age + ", Email: " + request.result.email); 
     } else { 
      console.log("Kenny couldn't be found in your database!"); 
     } 
    }; 
} 

function buttonreadAll(plantsBind) { 
    var transaction = db.transaction(["plantsStore"]); 
    var objectStore = transaction.objectStore("plantsStore"); 


    objectStore.openCursor().onsuccess = function (event) { 
     var cursor = event.target.result; 

     if (cursor) { 

      var plantsBind = cursor.value; 
      var jsonStr = JSON.stringify(plantsBind); 
      console.log(jsonStr); 
      var dataList = new WinJS.Binding.List(cursor.value); 
      // Create a namespace to make the data publicly accessible. 
      var publicMembers = 
       { 
        itemList: dataList 

       }; 
      WinJS.Namespace.define("DataExampleA", publicMembers); 

      cursor.continue(); 
     } 
     else { 
      console.log("No more entries!"); 
     } 
    }; 
} 



WinJS.UI.Pages.define("/pages/hub/hub.html", { 
    processed: function (element) { 
     return WinJS.Resources.processAll(element); 
    }, 

    // This function is called whenever a user navigates to this page. It 
    // populates the page elements with the app's data. 
    ready: function (element, options) { 

     var readAll = document.getElementById("readAll"); 
     readAll.addEventListener("click", buttonreadAll, false); 

    }, 


    unload: function() { 
     // TODO: Respond to navigations away from this page. 
    }, 

    updateLayout: function (element) { 
     /// <param name="element" domElement="true" /> 

     // TODO: Respond to changes in layout. 



    }, 
}); 




})(); 

和我的HTML

<div class="section3" data-win-control="WinJS.UI.HubSection" data-win-options="{ isHeaderStatic: true }" data-win-res="{ winControl: {'header': 'Section3'} }"> 
        <div id="IconTextTemplate1" class="win-container win-itembox win-item" data-win-control="WinJS.Binding.Template"> 
        <div style=" padding: 5px; overflow: hidden; display: -ms-grid;"> 
         <img data-win-bind="alt: title; src: picture" src="#" style="width: 80%; margin-left: 10%; margin-right:10%; margin-bottom:2%; -ms-grid-column: 1;" /> 
         <div style="margin: 15px; -ms-grid-row: 2"> 
          <h3 data-win-bind="innerText: title"></h3> 
          <h3 data-win-bind="innerText: picture"></h3> 
          <h6 data-win-bind="innerText: text"></h6> 
         </div> 
        </div> 
       </div> 
       <div id="basicListView" data-win-control="WinJS.UI.ListView" 
        data-win-options="{ 
        itemDataSource : DataExampleA.itemList.dataSource, 
        itemTemplate: select('#IconTextTemplate1'), 
        layout : {type: WinJS.UI.GridLayout}}"> 
       </div> 
       </div> 

回答

1

爲了增加克里斯托夫的反應,要替換此代碼:

var dataList = new WinJS.Binding.List(cursor.value); 
// Create a namespace to make the data publicly accessible. 
var publicMembers = 
    { 
    itemList: dataList 

}; 
WinJS.Namespace.define("DataExampleA", publicMembers); 

只需這條線,因爲您已經創建了一個清單:

DataExampleA.itemList.push(cursor.value); 

我在嘗試了這一點一個項目,它工作得很好。

問題是如何讓ListView在您向數據庫添加內容時自行更新。答案是,如果您將一個項目添加到ListView綁定到的DataExampleA.itemList,它將更新ListView。這意味着你需要有一個例程來更新列表,無論何時更改數據庫,基本上在應用程序運行時保持兩者並行。當應用程序重新啓動時,當然,您會從數據庫重新初始化Binding.List,以便它們同步啓動。

您可以採取的另一種方法是在IndexedDB上創建一個自定義數據源,您可以通過使用IListDataAdapter接口方法的某些部分實現對象來實現該功能,然後使用它創建一個WinJS.UI.VirtualizedDataSource。這是一個稍微多一點的工作,但如果您預計會有大量數據集,那麼它的規模會更大。有關詳細信息,請參閱我的second preview ebook (free)的第7章「收集控制數據源」一節。

+0

**愛你書**,這是很好的解釋。我還有其他問題,我可以刷新listView,因爲它再次添加一些數據,當我點擊buttonreadAll(),thaks – user1024610

+0

如果你有一個ListView綁定到一個WinJS.Binding.List,然後添加項目列表將觸發刷新列表顯示。這正是我想通過保持你的db和List對象同步來說的。 –

+0

@ KraigBrockschmidt-MSFT tnx用於共享。我會看看它,看看如何將它插入我的框架。 –

0

您正在創建每次檢索項的新列表。

使用push方法將新項目添加到listview集合。

我不是100%確定這會起作用。我已經嘗試了這一段時間,並沒有按照我想要的方式工作。我相信我遇到的問題是,當我添加數據時沒有觸發事件,並且這樣他們沒有可視化。

0

請勿使用全局數據庫變量。