gpt4 book ai didi

javascript - 具有双向绑定(bind)的隔离范围指令不反射(reflect) Controller 范围的变化

转载 作者:行者123 更新时间:2023-11-30 10:14:03 25 4
gpt4 key购买 nike

总结:

当尝试修改已在隔离作用域指令中为双向数据绑定(bind)设置的作用域变量(数组)时,对隔离作用域指令中变量的修改不会反射(reflect) Controller 作用域内的更改。

玩具示例:

目前我有一个排序指令,我想在使用 ng-repeat 的表上定义它。 ng-repeat 在 ATableController Controller 范围内使用相同的数据来创建表:

$scope.tableData = [{'col1' : 1,'col2' : 'fff'},
{'col1' : 2,'col2' : 'aaa'},
{'col1' : 3,'col2' : 'bbb'},
{'col1' : 4,'col2' : 'ccc'}];

我希望排序指令在其隔离范围内操作相同的数据。

在指令中设置如下

... scope :
{
tableSortData : '=',
tableSortRowAccessor : '=',
tableSortPrimer : '='
},
...

索引中引用如下

...
<body ng-controller="ATableController">
<table table-sort table-sort-data="tableData">
...

在链接函数中,点击处理程序被分配给表头。单击此处理程序会触发 sort 函数,该函数最终会运行这行代码。

scope.tableSortData = [];//这将是真实代码中的排序行

这些更改不是是在 Controller 内进行的,因此表格不会按预期更改。

这是一个 vanilla js 问题,(正在制作错误的引用等...)还是我的 angular 指令有问题。无论哪种方式,我做错了什么,如何解决?

代码:

笨蛋

http://plnkr.co/edit/5yxRj6?p=info

索引.html

  <head>
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script data-require="angular.js@*" data-semver="1.2.0" src="http://code.angularjs.org/1.2.0/angular.js"></script>
<link rel="stylesheet" href="style.css" />
<script src="script.js"></script>
</head>

<body ng-controller="ATableController">
<table table-sort table-sort-data="tableData">
<thead>
<tr>
<th>Column1</th>
<th>Column2</th>
</tr>

</thead>
<tbody>
<tr ng-repeat="row in tableData" >
<td>{{row.col1}}</td>
<td>{{row.col2}}</td>
</tr>
</tbody>
</table>
</body>

</html>

脚本.js

var myApp = angular.module('myApp', [])

.controller('ATableController', function($scope)
{
$scope.tableData = [{'col1' : 1,'col2' : 'fff'},
{'col1' : 2,'col2' : 'aaa'},
{'col1' : 3,'col2' : 'bbb'},
{'col1' : 4,'col2' : 'ccc'}];

})

.directive('tableSort', [function()
{
return {
restrict : 'A',
replace : false,

scope :
{
tableSortData : '=',
tableSortRowAccessor : '=',
tableSortPrimer : '='
},

link : function(scope, element)
{
console.log(scope.tableSortData);

// Await click events on header
element.find('th').on('click.header', function(event)
{
var field = $(event.target).attr('field-name');
augmentTableSortData();
});

function augmentTableSortData()
{
console.log(scope);
console.log(scope.tableSortData);
scope.tableSortData = [];
console.log(scope.tableSortData);
}

}
}

}])

最佳答案

问题是您没有在点击函数中调用 scope.apply:

 function augmentTableSortData()
{
console.log(scope);
console.log(scope.tableSortData);
scope.tableSortData = [];
console.log(scope.tableSortData);
scope.$apply(); // <------ this needs to be called because the scope data is being modified in the click function outside of angular's digest cycle.
}

演示:http://plnkr.co/edit/as5Wek?p=preview

Documentation :

Scopes provide APIs ($apply) to propagate any model changes through the system into the view from outside of the "Angular realm" (controllers, services, Angular event handlers).

关于javascript - 具有双向绑定(bind)的隔离范围指令不反射(reflect) Controller 范围的变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24945895/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com