Javascript 在AngularJS中与服务器同步时保留窗体上的浏览器状态
我有一个HTML表单,它由一个名为Javascript 在AngularJS中与服务器同步时保留窗体上的浏览器状态,javascript,api,angularjs,Javascript,Api,Angularjs,我有一个HTML表单,它由一个名为a的对象的ngModel支持。当用户在表单中输入数据时,服务器上的资源将通过PUT请求进行更新。我需要使用服务器从此请求返回的数据来更新/替换我的本地数据,因为像lastModified之类的内容将发生更改 替换整个对象(如a=b(其中b是服务器响应)会导致整个HTML表单重新呈现,因为就ngModel而言,它有一个全新的对象。这也是不好的,因为这意味着,如果用户有一个聚焦的输入,当表单重新呈现时,输入将失去焦点 我已经编写了一个函数来递归地添加/删除/更新对象
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)。从服务器返回数据后,现有引用将填充实际数据。这是一个有用的技巧,因为通常资源被分配给模型,然后由视图进行渲染。如果对象为空,则不会进行渲染,一旦数据从服务器到达,对象将填充数据,视图将自动重新渲染自身,显示新数据
.$resourceOops,我的表单上没有ngModel
。我没有正确解释这个问题的错误。实际上,我正在对一些数据使用ngRepeat
指令,而a
是该repeat中的一个元素extend
会解决这个问题,但是如果我在该对象内部重复数据(即ng:repeat=“a.elements中的元素”
),那么extend
会覆盖该数据(每个元素
对象),从而破坏引用并导致角度重新渲染。您尝试过jquery deep extend吗?应该有一面旗帜。抱歉,只是猜测,但没有实际的代码,这有点像猜测游戏。