AngularJS:ng在自定义指令中重复不更新
AngularJS : ngRepeat in custom directive not updating
我创建了一个包含ng-repeat
的自定义指令。如果我从指令触发模型更新,则ng-repeat
不会显示数据更改,直到视图中发生其他情况。我确定数据已正确更新。这是代码:
控制器:
app.controller('myCTRL', ['$scope', function ($scope) {
//the 'model':
$scope.data=[];
for (var i = 0; i < 9; i++)
$scope.data.push({
'val':i+1,
'pos':i+1
});
$scope.directiveOptions = {
changeData: function (from, to) {
//here is the data update:
var tmp= $scope.data[from].val;
$scope.data[from].val =$scope.data[to].val;
$scope.data[to ].val =tmp;
}
};
$scope.revertData = function () {
for (var i = 0; i < 9; i++)
$scope.data[i].pos = $scope.data[i].pos * -1;
};
}]);
视图:
<div ng-controller="myCTRL">
<div id="container" ng-my-directive='directiveOptions'>
<div ng-repeat="item in data | orderBy:'pos'" class="itemClass" >
<div>
{{item.val}}
</div>
</div>
</div>
<div ng-click="revertData()">revert</div>
</div>
命令:
app.directive('ngMyDirective', function () {
return {
restrict: 'A',
scope: {
directiveOptions: '=ngMyDirective'
},
link: function (scope, elem, attr) {
//...
elem.on(
'mouseup',
function (e) {
// here I call the data change, but ng-repeat doesn't update
var from=2, to=3;
if (scope.directiveOptions.changeData){
scope.directiveOptions.changeData(from, to);
}
}
);
//...
}
};
});
如果我单击revertData
div,我可以看到更新的数据。我必须在changeData
结束时强制$apply()
或在ng-repeat
中添加一个空ng-mouseover=""
,但我不敢相信这些是最好的方法,它们似乎只是技巧。
我错过了什么?
编辑
正如@yarons所建议的,在 jQLite 事件中使用$evalAsync,数据更改涉及视图更新。 但我不确定这是最佳实践。我正在从嵌套的 ng-repeat 指令访问一个$scope变量。该指令实现影响模型的 DOM 操作。这是最好的方法吗?
如果我
理解正确,您的数据会在mouseup
的事件侦听器回调中发生变化。在这种情况下,您的数据会在角度摘要循环之外更改,因此在角度视图中不会更改。尝试使用
elem.on(
'mouseup', function (e) {
scope.$evalAsync(function() {
var from=2, to=3;
if (scope.directiveOptions.changeData){
scope.directiveOptions.changeData(from, to);
}
});
}
);
相关文章:
- 如何根据服务更改更新指令
- AngularJs在调用服务方法后更新指令
- 无法更新指令的模型
- Angular.js正在更新指令中的SVG模板
- 隔离未更新指令中值的作用域
- 角度指令模板输入不会更新指令范围
- AngularJS:在成功的HTTP请求后更新指令范围
- 动态更新指令 (1.2 rc3)
- 更新指令中的attrs值 - 如何在AngularJS中执行此操作
- angularjs中没有更新指令作用域变量
- 正在从工厂更新指令
- 异步上未更新指令作用域
- 文本框未更新指令中显示的值
- 在测试期间更改了单向绑定指令属性,没有更新指令范围
- 动态更新指令数据
- 动态添加元素后更新指令
- Angular在作用域变量改变后更新指令
- 不能更新指令中的$scope值
- 当属性值改变时更新指令视图
- 当输入改变时更新指令