2016-03-27 42 views
1

我想創建一個使用離子框架的混合應用程序,但我被困在一個點上。我所要做的就是將三個不同輸入框中的值保存到'data.json'文件中,並在需要時檢索該數據或進行更改,並且無論應用程序是否正在運行,值都應保留在那裏。無法在.json文件中發佈數據

$http.get('js/data.json').success(function (data) { 
    $scope.values = data; 
}); 

HTML

<div ng-repeat="yoyo in values"> 
    <p ><h2>{{yoyo.name}}</h2></p> 
</div>` 

使用這段代碼,我通過在data.json文件陣中可用的對象能夠循環。但我無法發佈任何內容。

$scope.process = function() { 
    // var SendData = angular.toJson({ 
    // json: JSON.stringify() }); 

var SendData= { 
    "name": $scope.box1, 
    "owners": $scope.box2, 
    "country": $scope.box3, 
}; 

$http.post('js/data.json',SendData) 
    .success(function() { 
     console.log('done it bro'); 
    }); 
}; 

但是每當點擊按鈕時都會觸發上面的函數。它應該從這三個框中取值,並且應該推入data.json文件,但沒有任何反應。我在{{yoyo.name}}中看不到任何更改,因爲這應該顯示數組中的所有對象。但是我可以看到我的.success函數在console.log

請告知爲什麼我不能將數據保存在.json文件中或者什麼是正確的方法?

+0

您的文件是否是隻讀的? – PmanAce

+0

@PmanAce通過去data.json文件的屬性我可以看到只讀單選按鈕沒有被檢查,因此我猜它不是隻讀?乾杯 –

回答

1

您無法使用vanilla JavaScript將文件保存在服務器中。想想如果惡意用戶只用他的JavaScript控制檯就可以將數據發佈到我們的服務器上,就會發生所有問題?這就是爲什麼它不被允許。

因此,我們使用AJAX,一個工具與另一個服務器端API端點進行通信,這個端點實際上爲我們完成了這項工作。在這裏,您可以使用localStorage來保存您的SendData。更好的方法是使用像這樣的服務或工廠。

app.factory("LocalStorageService", ["$window", function ($window) { 
    var HasKey = function (key) { 
     return $window.localStorage && $window.localStorage.getItem(key); 
    }; 
    var GetItem = function (key) { 
     if ($window.localStorage) { 
      return $window.localStorage.getItem(key); 
     } 
     return null; 
    }; 
    var SetItem = function (key, value) { 
     if ($window.localStorage) { 
      $window.localStorage.setItem(key, value); 
      return true; 
     } 
     return false; 
    }; 
    var RemoveItem = function (key) { 
     if ($window.localStorage) { 
      return $window.localStorage.removeItem(key); 
     } 
     return null; 
    }; 
    return { 
     HasKey: HasKey, 
     GetItem: GetItem, 
     SetItem: SetItem, 
     RemoveItem: RemoveItem 
    }; 
}]); 

我們插入localStorage,工廠注入到你的應用程序,並調用它,

//To store into localStorage 
LocalStorageService.SetItem("personalDetails", JSON.stringify(SendData)); 

//To retrieve from localStorage 
var DTO = LocalStorageService.GetItem("personalDetails"); 
var personalDetails = JSON.parse(DTO); 

P.S:請儘快開始使用更好的命名約定。否則,它將成爲一個不容易突破的壞習慣。 ;)

+0

謝謝隊友,我看了上面的例子,我理解它的概念。只是一個問題,我將如何在「個人詳細信息」中添加新元素並不斷更新它。我不想有多個值的多個鍵。我將所有數據存儲在jSon格式的一個密鑰下。任何想法? –

1

要做$http.post您需要一個後端API(PHP,Node Js等)來捕獲您想要的數據並通過文件系統中的讀寫方法保存到數據庫或JSON中。

+0

我不能簡單地將文件存儲在本地存儲?我不想在服務器中存儲數據。什麼是正確的方法來做到這一點? –

+0

另外,如果它可以從json文件http.get數據,它應該也能夠寫入它? –

0

您不能直接將數據寫入.j子文件。但您可以從.j兒子文件接收數據。對於這樣的場景,你可以選擇諸如瀏覽器本地存儲,Web SQL,SQL lite之類的選項。

記住對於靜態的.j子文件在本地只能用於讀取j子值。

+0

我會嘗試localstorage因爲這就是我需要的。我嘗試將數據存儲在一個函數中,但是當頁面重新加載時,這些數據就消失了......但我需要與之相反。無論如何幹杯 –

+0

從你的代碼片段。我可以理解你從本地的data.json文件中獲取數據,併成功嘗試到相同的data.json。這是不可能的..如果你更新了代碼段,請在這裏分享..如果你使用本地存儲,你將重新分配所有dom刷新的本地存儲值...對不起,如果我的觀點有任何問題出錯。 – Shamil