Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/427.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 我如何以类似于JSFIDLE的方式允许共享?_Javascript_Angularjs - Fatal编程技术网

Javascript 我如何以类似于JSFIDLE的方式允许共享?

Javascript 我如何以类似于JSFIDLE的方式允许共享?,javascript,angularjs,Javascript,Angularjs,我正在开发一个小应用程序,希望用户能够与他人共享。整个应用程序使用AngularJS在客户端运行。没有访问服务器的权限(我已经需要了) 具体来说,有一个角度对象是共享配置的一部分。有没有一种方法可以将这个对象完全转换成一个字符串,或者允许我从这个字符串重新构建对象 换句话说,我的(数组)对象如下所示: // Variable number of objects stored in the array. 3 shown here. var arrayObj = [ {prop1: "somet

我正在开发一个小应用程序,希望用户能够与他人共享。整个应用程序使用AngularJS在客户端运行。没有访问服务器的权限(我已经需要了)

具体来说,有一个角度对象是共享配置的一部分。有没有一种方法可以将这个对象完全转换成一个字符串,或者允许我从这个字符串重新构建对象

换句话说,我的(数组)对象如下所示:

// Variable number of objects stored in the array. 3 shown here.
var arrayObj = [
  {prop1: "something", prop2: "other", prop3: "other"},
  {prop1: "something", prop2: "other", prop3: "other"},
  {prop1: "something", prop2: "other", prop3: "other"}
]
我可以把整个数组对象转换成字符串,比如
jn2340932rnxmclxm3290rj23ionqopdfsd923h413
,这样我就可以把它放到URL中:

http://mysite.me/jn2340932rnxmclxm3290rj23ionqopdfsd923h413


然后在JavaScript中重新构建相同的对象?如何重建它?

基于以下答案: (它提到了atob和btoa的浏览器限制)

一旦字符串化,您可以使用base64对json对象进行编码和解码

你可以这样做:

extractObject = function(str){
    return JSON.parse(atob(str));
}

makeShareableString = function(obj){
    return btoa(JSON.stringify(obj));
}



var test = {"this":"that","foo":"bar"};

makeShareableString(test);
// returns "eyJ0aGlzIjoidGhhdCIsImZvbyI6ImJhciJ9"

extractObject("eyJ0aGlzIjoidGhhdCIsImZvbyI6ImJhciJ9");
// returns {"this":"that","foo":"bar"}
值得一提的是,base64编码的字符串几乎总是比JSON.stringify的字符串长度大很多



我倾向于认为,JSFIDLE实现共享的方式是生成UUID(参见此答案),然后将数据存储在数据库中。这个UUID可能只是为了阻止scraper在url字符串中使用数据库行id的情况下简单地增加一个数字并敲打他们的系统。但是,如果我提供将其转换为字符串并将其编码为以64为基数的字符串,那么这将不是一个纯粹的js解决方案

然后

var arrayObj = [
{prop1: "something", prop2: "other", prop3: "other"},
{prop1: "something", prop2: "other", prop3: "other"},
{prop1: "something", prop2: "other", prop3: "other"}
]
var str = JSON.stringify(arrayObj);
var encodeString = Base64.encode(str)
一旦发送,您可以将其解码回使用

Base64.decode(str);

您当然可以将对象编码为字符串,但它将是一个相当长的字符串,因此是一个非常可笑的URL,而这绝对不是JSFIDLE所做的。您的三个项目的示例数组是典型的,还是对象可以大得多?@nnnnnn:对象可以大得多。我正在考虑使用一个UUID和一个数据库来完成这项工作,正如公认的答案中所建议的那样。有什么输入吗?是的,我会这么做。你可以使用bitly或tinyurl这样的服务将长url转换为短url,而无需维护自己的数据库。许多这样的提供者提供了一个API。把它看作是8KB的自由状态存储……说我愿意放弃纯JS并考虑使用数据库。然后我可以将base64字符串存储在数据库中,与上面的UUID关联?这样做的后果是什么?就个人而言,我不想麻烦base64编码您的数据如果您最终要将其存储在数据库中,您可以使用
JSON.stringify
将数据转换为可存储的字符串。根据我的假设,UUID实际上只是为了阻止机器人通过增加一个数字来敲打页面。你可以很容易地使用“名称”、“slug”、“id”(“id”只是假设你不必担心机器人),只要它是唯一的,就像数据库中的键一样,并在你的url中使用它。(1/2)…(续2/2)使用angular,我将对JSON字符串执行AJAX
POST
,将其发送到服务器正在运行的任何体系结构上,并让它创建UUID,存储两者,然后返回UUID。在将任何内容返回到客户端之前,服务器需要生成并确认UUID的唯一性。当客户端接收到成功的返回时,我将重定向/更新url地址,以将UUID包含在您期望的结构中。然后向用户显示一些成功消息,内容已成功保存
:)