我正在尝试将JSON的数据存储在服务中的共享数组中。问题是,每次我想用一些新内容(例如新的JSON)更新服务的数组时,我需要首先清除数组,然后数组保持为空,而不是加载新数据。
我的服务如下:
.service('jsonTest',
function() {
var json = [];
function storeJson(file) {
json=[];
json.push(file);
}
return {
storeJson: storeJson,
showJson: json
}
});
如您所见,我每次都在使用
加载新数据之前清理数组json = [];
但是在加载新内容后它仍然是空的。
我在这里做错了什么?
您可以在此处查看该示例:http://plnkr.co/edit/tN9WvNminw1uLpThWPvu?p=preview 该服务位于app.js中,正在MainCtrl(main.js)和ProductCtrl(product.js)中使用。
请问任何建议?
答案 0 :(得分:1)
你不会每次看到json并更新showJson。您需要执行以下操作:
.service('jsonTest', function() {
var json = {
showJson: [],
storeJson: function(file) {
json.showJson=[];
json.showJson.push(file);
}
};
return json;
});
由于json
是一个局部变量,当您在[]
内将其设置为storeJson
时,它会使用新的内存位置,即它不是引用变量,因此showJson
不会自动更新。如果你正在清除现有的数组(可能是.pop
,直到没有剩下的元素),它会起作用,但是因为你正在分配一个 new 空数组,所以它不会#&# 39;吨
或者,您也可以将showJson
作为返回json
的函数。那也行。
.service('jsonTest', function() {
var json = [];
function storeJson(file) {
json=[];
json.push(file);
}
function showJson() {
return json;
}
return {
storeJson: storeJson,
showJson: showJson
}
});
答案 1 :(得分:1)
我认为你应该使用空对象而不是数组。
.service('jsonTest', function() {
var json = {};
return {
set: function(val){
json = val;
},
get: function(){
return json;
}
};
});
更新了您的Plunker
答案 2 :(得分:0)
或许,更好的结构是将$ http调用移动到服务本身,因此它真正的服务。 Tben将服务注入MainCtrl。
因此,您可以调用服务(让我们称之为' myAppService'),如:
$(document).ready(function() {
$("#submitButton").click(addListItem);
});
function addListItem() {
var $entryText = $("#entry").val();
$("#list").append("<li>" + $entryText + "</li>");
}
和服务/工厂:
.controller('MainCtrl', ['$scope', '$log', 'myAppService',
function ($scope, $log, myAppService) {
$scope.getData = function(filepath) {
// do something with results ie. store etc.
var fileOrPromise = myAppService.get(filepath);
};
]);
以下是对设计和最佳实践的一些参考: