gpt4 book ai didi

javascript - AngularJS ng-repeat 重新渲染

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:47:17 28 4
gpt4 key购买 nike

我正在使用 AngularJS 构建一个简单的应用程序。该应用程序对服务器进行异步 AJAX 调用,服务器返回如下数组:

{
paragraphs: [
{content: "content one"},
{content: "cnt two"},
{content: "random three"},
{content: "last one yeeaah"}
]
}

所以我通过我的 set 方法将此内容设置到 StorageService 工厂。这里一切都很好。

我正在使用 ng-repeat 来呈现结果,并使用 JQuery UI sortable 来更改元素的顺序。当一个项目被交换时,我的脚本正在调用 StorageService.swap 方法并且 StorageService 中的元素顺序被更新,但是 ng-repeat 没有重新呈现更改,但是如果我删除/添加或更改它正在工作的内容。我如何强制 Angular 重新渲染 ng-repeat?

=JSFIDDLE =

http://jsfiddle.net/6Jzx4/3/

= 示例 =

Example

当发生交换时,应该重新渲染 ng-repeat,所以 ID 是连续的

=代码=

HTML

<div ng-controller="Test" sortable>
<div ng-repeat="item in data().paragraphs" class="box slide_content" id="{{$index}}">
{{item.content}}, ID: {{$index}}
</div>

<input type="button" ng-click="add()" value="Add">
</div>

JS

var App = angular.module("MyApp", []);

App.controller("Test", function($scope, StorageService) {
StorageService.set({
paragraphs: [
{content: "content one"},
{content: "cnt two"},
{content: "random three"},
{content: "last one yeeaah"}
]
});

$scope.data = StorageService.get;

$scope.add = StorageService.add;
});

App.directive("sortable", function(StorageService) {
return {
link: function(scope, element, attrs) {
$(element[0]).sortable({
cancel: ".disabled",
items: "> .slide_content:not(.disabled)",
start: function(e, t) {
t.item.data("start_pos", t.item.index());
},
stop: function(e, t) {
var r = t.item.data("start_pos");
if (r != t.item.index()) {
StorageService.sort($(this).sortable("toArray"));
}
}
});
}
};
});

App.factory('StorageService', function() {
var output = {};

return {
set: function(data) {
angular.copy(data, output);
return output;
},
get: function() {
return output;
},
add: function() {
output.paragraphs.push({
content: 'Content'
});
},
sort: function(order) {
var localOutput = [];

for (var j in order) {
var id = parseInt(order[j]);
localOutput.push(output.paragraphs[id]);
}

console.log('new order', localOutput);

output.paragraphs = localOutput;
return output;
}
};
});

最佳答案

Angular 不知道你已经改变了数组。在 scope.$apply() 中执行您的排序将解决这个问题。

请注意,我添加了一个 that 变量,因为 this 改变了 apply 中的含义。

var that = this;
scope.$apply(function() {
StorageService.sort($(that).sortable("toArray"));
}

但该修复程序揭示了其他问题,这些问题似乎是由 jQuery sortable 和 Angular 之间的交互引起的(这里是 fiddle,它显示了解决问题但仍然存在问题的尝试)。这些问题已在 Angular UI Sortable 中得到解决.因此,一个好的前进方向可能是切换到这个。

关于javascript - AngularJS ng-repeat 重新渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20820413/

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