Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.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 在AngularJS中与服务器同步时保留窗体上的浏览器状态_Javascript_Api_Angularjs - Fatal编程技术网

Javascript 在AngularJS中与服务器同步时保留窗体上的浏览器状态

Javascript 在AngularJS中与服务器同步时保留窗体上的浏览器状态,javascript,api,angularjs,Javascript,Api,Angularjs,我有一个HTML表单,它由一个名为a的对象的ngModel支持。当用户在表单中输入数据时,服务器上的资源将通过PUT请求进行更新。我需要使用服务器从此请求返回的数据来更新/替换我的本地数据,因为像lastModified之类的内容将发生更改 替换整个对象(如a=b(其中b是服务器响应)会导致整个HTML表单重新呈现,因为就ngModel而言,它有一个全新的对象。这也是不好的,因为这意味着,如果用户有一个聚焦的输入,当表单重新呈现时,输入将失去焦点 我已经编写了一个函数来递归地添加/删除/更新对象

我有一个HTML表单,它由一个名为
a
的对象的
ngModel
支持。当用户在表单中输入数据时,服务器上的资源将通过PUT请求进行更新。我需要使用服务器从此请求返回的数据来更新/替换我的本地数据,因为像
lastModified
之类的内容将发生更改

替换整个对象(如
a=b
(其中
b
是服务器响应)会导致整个HTML表单重新呈现,因为就
ngModel
而言,它有一个全新的对象。这也是不好的,因为这意味着,如果用户有一个聚焦的输入,当表单重新呈现时,输入将失去焦点

我已经编写了一个函数来递归地添加/删除/更新
对象上的键,同时保留所有引用,从而避免了重新渲染。然而,我感觉这是一个糟糕的方法。这是Angular中的常见问题吗?我还可以如何解决它?还是我做错了什么


更新:我的表格上没有
ngModel
。更确切地说,表单是
ngRepeat

中的一个迭代元素,首先要澄清的是-我希望您的表单上没有ngModel,而是表单的每个输入上都有ngModel

现在让我们来看看有用的一点:你知道angular.extend吗?它用于通过源对象的值扩展目标对象,保留引用。 参考您的“a”对象和“b”响应对象,可以简单如下:

angular.extend(a, b);
还有一个更强大的同名jQuery。(不过,在使用jQuery时,不要忘记您的摘要/应用调用)

您可能还希望以更结构化的方式处理资源。该bit应特别有趣:

重要的是要认识到调用$resource对象方法会立即返回一个空引用(对象或数组取决于isArray)。从服务器返回数据后,现有引用将填充实际数据。这是一个有用的技巧,因为通常资源被分配给模型,然后由视图进行渲染。如果对象为空,则不会进行渲染,一旦数据从服务器到达,对象将填充数据,视图将自动重新渲染自身,显示新数据


.$resource

Oops,我的表单上没有
ngModel
。我没有正确解释这个问题的错误。实际上,我正在对一些数据使用
ngRepeat
指令,而
a
是该repeat中的一个元素
extend
会解决这个问题,但是如果我在该对象内部重复数据(即
ng:repeat=“a.elements中的元素”
),那么
extend
会覆盖该数据(每个
元素
对象),从而破坏引用并导致角度重新渲染。您尝试过jquery deep extend吗?应该有一面旗帜。抱歉,只是猜测,但没有实际的代码,这有点像猜测游戏。