具体$ scope.apply();情形:

时间:2015-09-14 02:47:25

标签: javascript angularjs

我是棱角分明的新手,我一直在努力学习如何运作。我正在制作一个简单的应用程序,有人可以通过简单的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>

1 个答案:

答案 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;直到其他一些变化发生并强制消化周期

来表示范围