控制器之间的绑定持久性很奇怪
Strange binding permanence between controllers
我有一个项目,你在一个公式中写笔记。然后,将该注释提交到信息容器中(现在它只是一个用于测试目的的数组,但稍后打算将其作为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中。您首先创建一个指向123123的temp
变量,然后将其发送到服务,服务将相同的地址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));
- 在VanillaJS中模拟模型双向数据绑定
- 无法通过数组映射绑定
- 主干-不管怎样,检查事件以前是否绑定过
- 用于搜索的聚合物嵌套绑定
- Angular:更新一次性绑定的数据
- 如何使用ngrepeat和双向绑定获得指令的隔离范围
- react.js中的密钥绑定
- 使用regex的jquery keydown绑定不会验证撇号和句点
- 将事件处理程序绑定到任何可能的事件
- AngularJS指令只识别双向绑定类型
- Telerik rad组合框多列数据绑定
- 对API数据使用声明性绑定
- 如何销毁/删除/取消绑定SnapSVG.js
- 在D3.js中,有没有任何方法可以将x和y方向上的滚动事件绑定到平移svg
- 数据绑定:'系统Char'不包含名为'xxxxx'
- react组件中的绑定方法
- 如何将ngrepeat下的ngmodel绑定到$scope
- WinJS内联绑定语法
- Javascript 事件绑定持久性
- 控制器之间的绑定持久性很奇怪