Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript AngularJS ng重复重发器_Javascript_Angularjs_Rendering_Jquery Ui Sortable_Angularjs Ng Repeat - Fatal编程技术网

Javascript AngularJS ng重复重发器

Javascript AngularJS ng重复重发器,javascript,angularjs,rendering,jquery-ui-sortable,angularjs-ng-repeat,Javascript,Angularjs,Rendering,Jquery Ui Sortable,Angularjs Ng Repeat,我正在用AngularJS构建一个简单的应用程序。应用程序对服务器进行异步AJAX调用,服务器返回如下数组: { paragraphs: [ {content: "content one"}, {content: "cnt two"}, {content: "random three"}, {content: "last one yeeaah"} ] } 因此,我通过set方法将此内容设置为StorageServi

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

{
    paragraphs: [
        {content: "content one"},
        {content: "cnt two"},
        {content: "random three"},
        {content: "last one yeeaah"}
    ]
}
因此,我通过set方法将此内容设置为StorageService工厂。这里一切都很好

我使用
ng repeat
来呈现结果,并使用
jqueryui sortable
来更改元素的顺序。交换项目时,我的脚本将调用StorageService.swap方法并更新StorageService中的元素顺序,但ng repeat不会重新提交更改,但如果我删除/添加或更改内容,它将正常工作。我怎样才能强迫角型机器人重新启动ng重复

=JSFIDDLE=

=示例=

发生交换时,应重新发送ng repeat,以便ID是连续的

=代码=

HTML


Angular不知道你改变了数组。在
范围内执行排序。$apply()
将解决这个问题

请注意,我添加了一个
,该
变量,因为
更改了
应用中的含义

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

但该修复发现了其他问题,这些问题似乎是由jQuery可排序和Angular之间的交互引起的(下面是一个示例,显示了解决问题的尝试,但仍然存在问题)。这些问题已在2007年得到解决。因此,一个很好的前进方向可能是切换到这一点。

我在JSFIDLE中没有看到相关的代码……它也应该在本文中。我想这是因为您没有正确地使用承诺,或者您最终需要一个
$scope.$apply()
。演示应该向我们展示什么?若演示不复制问题,则很难提供帮助listed@charlietfl看看下面的图片“示例”,它解释了我的问题。当交换发生时,由于某种原因,不会重新请求重复。请参见中间的图片(交换后),注意第二个元素的ID为2,第三个元素的ID为1,如图3所示,应该是visa,反之亦然。最近的问题是需要
$apply
,但是jquery sortable和Angular之间似乎还有许多其他不兼容之处。所以我建议你看看它,它需要一些重组才能运行,但是你应该有更兼容的东西。太好了-很高兴这对你有用谢谢你的答案。我发现了一些问题。转到小提琴,交换第二场与第三,按新:另一个:交换最后与第一,按下新的,看看发生了什么。也许其他的功能也一样-但是你得到了这个概念。以下是更新添加的一种方法:
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;
        }
    };
});
var that = this;
scope.$apply(function() {   
   StorageService.sort($(that).sortable("toArray"));
}