在我正在处理的项目中,我正在通过 Angular 在待办事项列表上应用 ui-sort,并尝试在用户编辑任务时进行切换。我当前测试此切换的方法是使用按钮来打开和关闭排序。
我的策略是这样的:使用一个角度指令来生成一个带有排序的初始模板。添加一个按钮,单击该按钮可修改控制器中的范围变量 ($scope.sortingEnabled) 以在 true 和 false 之间切换。在我的指令中,我在链接函数中的“sortingEnabled”上设置了一个监视,以从 .
这是我尝试使用指令之前的 in todo.html: sortableOptions 是一个函数,用于对内部记录上的 todos 重新排序。
<ul class="unstyled" ng-model="todos" ui-sortable="sortableOptions">
<!-- list items here via ng-repeat -->
</ul>
以下是我的指令后 todo.html 中的代码:
<sortable></sortable>
我目前在 todo-directives.js 中的指令草案:
app.directive('sortable', function() {
var innerHtml = '<li ng-repeat="todo in todos" class="item">' +
'<span ng-model="todo.name" >{{todo.name}}</span> ' +
'</li>';
var link = function (scope, element, attrs) {
scope.$watch('sortingEnabled', function() {
if(scope.sortingEnabled === true) {
element.contents().attr("ui-sortable", "sortableOptions");
//needed else ui-sortable added as a class for <ul> initially for
//some reason
element.contents().removeClass("ui-sortable");
}
else {
element.contents().removeAttr("ui-sortable");
//needed else ui-sortable added as a class for <ul> initially for
//some reason
element.contents().removeClass("ui-sortable");
}
});
};
return {
restrict: 'E',
transclude: true,
template: '<ul class="unstyled" ng-model="todos" ui-sortable="sortableOptions" ng-transclude>' + innerHtml + '</ul>',
link: link
};
});
此代码在 Chrome 调试器的源代码视图中有效,但视图无法正确刷新。我在 watch 函数中尝试了 scope.$apply() ,但是得到了一个 $digest 已经运行的错误。我也尝试过 $compile,但我对它的工作原理非常缺乏了解,所以我得到了一些我不记得的错误。我是否遗漏了一些重要的东西,或者做错了什么?我不确定,因为我的理解力很低,因为我已经学习 Angular 几个星期了。任何帮助将不胜感激!