0

我试图把这个 jQuery 插件 变成一个 Angular 指令。我做了以下事情:

define(['directives/directives'], function(directives){
directives.directive('vivifysortable', ['$rootScope', function ($rootScope){
    return {
        controller: function ($scope, $element, $attrs){
            // here i pasted definition of multiselectable, 
            //and multisortable from the above jsfiddle
        },
        link: function($scope, $element, $attrs) {
            if ($scope.$last === true) {                    
                setTimeout(function() {
                        angular.element($element).multisortable({                            
                        connectWith: ".product-backlog-column",
                        selectedClass: "ui-selected"
                    });
                })
            }
         }   
    }
}]); 
});

如果我有这样的东西,这很好用

 <ul class="product-backlog-column" vivifysortable >
    // some hardcoded values for testing purposes
    <li> test  1 </li>
    <li> test  2 </li>
    <li> test  3 </li>
 </ul>

但如果我使用ng-repeat,看起来它根本不起作用

<ul class="product-backlog-column" vivifysortable >
    <li ng-repeat='item in items'>
        {{item.title}}
    </li>
</ul>

看起来,ng-repeat` 让我很难过,但我不知道为什么,以及如何解决它。

这是jsfiddle(我不确定我是否正确创建了它,包括 Angular onLoad 和 jQuery 作为外部资源)。

4

1 回答 1

3

我通过添加解决了这个问题$timeout。重构后的代码如下所示:

 link: function($scope, $element, $attrs) {
            $timeout(function () {
                angular.element($element).multisortable({

                    connectWith: ".product-backlog-column",
                    selectedClass: "ui-selected"
                });
            }, 0);

  }   

事情是$timeout会停止执行指令,直到ng-repeat完成渲染。这是我初学者的解释。如果有经验的人可以对此进行更多说明,请这样做。

于 2013-09-11T13:44:24.177 回答