控制器之间的绑定持久性很奇怪

Strange binding permanence between controllers

本文关键字:持久性 绑定 之间 控制器      更新时间:2023-09-26

我有一个项目,你在一个公式中写笔记。然后,将该注释提交到信息容器中(现在它只是一个用于测试目的的数组,但稍后打算将其作为DB)。

处方集有以下控制器:

app.controller('controlFormulario', ['$scope', 'SubmitService', function($scope, submitService) {
  $scope.formData = {
    "titulo":"",
    "texto":"",
    "fecha": new Date()
  };
    $scope.submit = function() {
        var temp = $scope.formData;
        submitService.prepForBroadcast(temp);

    }
// more things we don't need now

…它被绑定到DOM的这一部分,并通过一个指令添加到DOM中:

<form ng-controller="controlFormulario as formCtrl">
        <div class="element">
          <div class="form-group" ng-class="{'has-error': formData.titulo.length > 50 }">
            <label for="inputTitulo">Título</label>
            <input type="titulo" class="form-control"  id="inputTitulo" ng-model="formData.titulo">
            <span ng-show="formData.titulo.length > 50" id="helpBlock" class="help-block">El título no puede exceder los 50 caracteres.</span>
          </div>
          <div class="form-group">
            <label for="inputTexto">Texto</label>
            <textarea class="form-control" id="inputTexto" ng-model="formData.texto"></textarea>
          </div>
          <div class="form-group">
            <label for="fecha">Fecha</label>
            <input type="fecha" class="form-control" id="fecha" ng-model="formData.fecha" disabled>
          </div>
          <div class="form-group" >
            <button  class="btn btn-primary" style="height:35px;width:100px;float:right;"  id="submit"
            ng-disabled="isDisabled()" ng-click="submit()">
            Enviar
            </button>
          </div>
        </div>
        <div class="note" ng-show="formData.titulo.length > 0">
         <div class="title" ng-model="formData.titulo" class="title">{{formData.titulo | limitTo:50}}</div>
         <div class="text" ng-model="formData.texto" class="text">{{formData.texto}}</div>
         <div class="date" ng-model="formData.fecha" class="date">{{formData.fecha | date}}</div>
        </div>
      </form>

这是我的指令(我不认为它真的需要,但以防万一):

app.directive('formulario', [function() {
  return {
    restrict: 'E', // C: class, E: element, M: comments, A: attributes
    templateUrl: 'modules/formulario.html',
  };
}]);

我使用一个服务在前一个控制器和笔记控制器(它控制数组的笔记对象)之间传递数据。这是服务:

app.factory('SubmitService', function($rootScope) {
    var data = {};
    data.prepForBroadcast = function(recvData) {
        data.data = recvData;
        this.broadcastItem();
    };
    data.broadcastItem = function() {
        $rootScope.$broadcast('handleBroadcast');
    };
    return data;
});

…我在我的笔记控制器的这一部分接收它:

app.controller('noteController', ['$scope', 'SubmitService', function($scope, submitService) {
  var nc = this;
    $scope.$on('handleBroadcast', function() {
        nc.pruebaNota.push(submitService.data);
        $scope.formData.titulo = "";
        $scope.formData.texto= "";
        $scope.formData.fecha = new Date();
    });
// more things, the array, etc...

Ok。这应该可以工作,而且确实可以,但是奇怪的事情发生了:正如您所看到的,预览注释与ng-model绑定到表单上。很好,好的。但是,当我提交表单时,新的注释对象保持绑定到表单(因此,如果我删除表单文本,注释将显示为空白,如果我写了一些东西,它将在预览注释和新注释中自动更新),当它们之间没有任何关系时。新的注释,动态地出现在屏幕上,不应该绑定到任何东西。

我做错了什么吗?有人帮忙就太好了!

你忘记了一些非常重要的事情。内存地址。所以,大概的想法是这样的:想象$scope.formData在地址123123中。您首先创建一个指向123123temp变量,然后将其发送到服务,服务将相同的地址123123保存到data.data

然后在您的第二个控制器中,您说:嘿,我想使用data.data (AKA您的数据在123123),您有SubmitService

现在,当你再次修改$scope.formData时,你正在更新123123中的内容,并且所有正在"查找"该地址的内容都将更新。

这是一个粗略的想法。简单地说,就是在各处修改同一条信息。

请看这里:http://plnkr.co/edit/zcEDQLHFWxYg4D7FqlmP?p=preview

正如wolf建议的,要解决这个问题,您可以像这样使用angular.copy:

nc.pruebaNota.push(angular.copy(submitService.data));