我是棱角分明的新手,我一直在努力学习如何运作。我正在制作一个简单的应用程序,有人可以通过简单的html界面添加用户并使用SQLite将其存储在数据库中,然后他们就可以编辑或删除它们。
所以我试图了解$ scope.apply()的手动使用,所以我做了以下操作,以创建一个我需要使用它的场景:
在函数上,我将一些变量存储在localStorage中,然后我手动打开一个html:
localStorage.setItem('idUsuario',response.records[0].idUsuario);
localStorage.setItem('dato_Nombre',response.records[0].nombre);
localStorage.setItem('dato_ApPat',response.records[0].apPat);
localStorage.setItem('dato_ApMat',response.records[0].apMat);
localStorage.setItem('dato_Direccion',response.records[0].direccion);
localStorage.setItem('dato_Tel',response.records[0].telefono);
localStorage.setItem('dato_email',response.records[0].correo);
//debugger;
location.href = "editClient.html";}
在我打开的html上,我在我的控制器中声明了一个ng-init(),它接收存储的数据并将其分配给我在某些文本输入上声明的ng-model变量:
$scope.init = function () {
$scope.idUsuario=localStorage.getItem("idUsuario");
$scope.dato_Nombre=localStorage.getItem("dato_Nombre");
$scope.dato_ApPat=localStorage.getItem("dato_ApPat");
$scope.dato_ApMat=localStorage.getItem("dato_ApMat");
$scope.dato_Tel=localStorage.getItem("dato_Tel");
$scope.dato_Direccion=localStorage.getItem("dato_Direccion");
$scope.dato_email=localStorage.getItem("dato_email");
localStorage.clear();
}
<div class="list">
<label class="item item-input item-stacked-label">
<span class="input-label" >Nombre</span>
<input type="text" placeholder="Escriba su nombre" ng-model="dato_Nombre" >
</label>
<label class="item item-input item-stacked-label">
<span class="input-label">Apellido Paterno</span>
<input type="text" placeholder="Escriba su apellido paterno" ng-model="dato_ApPat">
</label>
<label class="item item-input item-stacked-label">
<span class="input-label">Apellido Materno</span>
<input type="text" placeholder="Escriba su apellido materno" ng-model="dato_ApMat">
</label>
<label class="item item-input item-stacked-label">
<span class="input-label">Dirección</span>
<input type="text" placeholder="Escriba su dirección" ng-model="dato_Direccion">
</label>
<label class="item item-input item-stacked-label">
<span class="input-label">Teléfono</span>
<input type="text" placeholder="Escriba su teléfono" ng-model="dato_Tel">
</label>
<label class="item item-input item-stacked-label">
<span class="input-label">Email</span>
<input type="text" placeholder="Escriba su correo" ng-model="dato_email">
</label>
<center>
<button class="button button-possitive" ng-click="editarCliente()">Actualizar</button>
</center>
</div>
因此,当表单加载时,输入实际上填充了我从localStorage带来的数据,然后我通过键入其他内容来修改该文本并调用一个函数,该函数返回每个ng模型中的数据,如预期的那样,没有更新到我在输入中键入的内容,仍然有从localStorage分配的数据,因此需要使用$ scope.apply()。
我的问题是,无论我在哪里尝试使用它,我总是会收到错误,说应用已经在运行,我无法弄清楚如何使用它来更新我的文本输入的内容。< / p>
答案 0 :(得分:2)
$ scope。$ apply会触发一个角度摘要周期,但由于您的更改发生在一个角度应用程序中,因此有一个周期已经在运行并处理您的数据,这就是为什么您会收到该错误,因为您不应该有消化周期同时执行。 $ scope。$ apply在角度环境的一些变化发生时很有用。例如,当你需要集成不友好的角度组件,如jquery插件或其他ui元素,处理他们的事件在角度世界的一侧。如果您想要在任何元素事件中更新角度应用程序,您需要使用$ scope。$ apply,如果您选择使用setTimeout或setInterval而不是为角度提供的$ timeout或$ interval服务,也会发生这种情况。 ,因为函数的执行将发生在角度摘要周期之外。
$.ajax({
url:'http://lslsls.com',
method: 'get'
})
.success(function(data){
var scope = angular.element($('#elementId')).scope();
scope.returnedData=data;
scope.$apply();
});
不要过多关注jquery部分,但要注意在成功函数中如何检索范围并更新,如果我不使用范围。$ apply()那里,值不会&# 39;直到其他一些变化发生并强制消化周期
来表示范围