更新:我遇到的问题是三件事的结合:
这是所有代码的plnkr:http
://plnkr.co/edit/A8lDKbNvhcSzbWVrysVm
我正在使用priorityChanged函数基于比较任务上的日期来添加标头:// controller var last = null; $
scope.priorityChanged = function(priority){var current =
moment(priority).startOf(’day’); varchanged = last === null ||
!last.isSame(current); 最后=当前;返回更改;};
//view
<li ng-repeat="task in list track by task.$id">
<h3 ng-show="priorityChanged(task.$priority)">{{getDayName(task.$priority)}}</h3>
并在完成任务时将任务移到列表的底部,当我填充任务列表时,我正在使用.sort函数:
var populateTasks = function(start, end) {
$scope.start = start;
$scope.end = end;
var ref = new Firebase('https://plnkr.firebaseio.com/tasks').startAt(start).endAt(end);
var list = $firebase(ref).$asArray();
list.sort(compare);
list.$watch(function() {
list.sort(compare);
});
function compare(a, b) {
return a.completeTime - b.completeTime;
}
$scope.list = list;
};
这些方法似乎无法一起使用。有没有一种将它们组合在一起的方法,以便当列表重新排序时,ng-
repeat将再次运行任务并添加必要的标头?那是理想的解决方案吗?标头可以分开吗?
更新:我将ng-init功能直接移到了h3中,试图使其再次运行,但是在这种情况下,它不显示标题。
Update2:如果至少两个$ priority日期是唯一的,则标题似乎确实会出现,但是我仍然存在删除或移动关联列表项以删除连接的标题的问题。
使用指令
您可以通过嵌套客户端内容来创建指令以简化操作。
demo
app.directive('repeatByWeek', function($parse, $window) {
return {
// must be an element called <repeat-by-week />
restrict: 'E',
// replace the element with template's contents
replace: true,
templateUrl: 'repeat.html',
// create an isolate scope so we don't interfere with page
scope: {
// an attribute collection="nameOfScopeVariable" must exist
'master': '=collection'
},
link: function(scope, el, attrs) {
// get the global moment lib
var moment = $window.moment;
scope.weeks = [];
updateList();
// whenever the source collection changes, update our nested list
scope.master.$watch(updateList);
function updateList() {
scope.weeks = sortItems(parseItems(scope.master));
}
function sortItems(sets) {
var items = [];
// get a list of weeks and sort them
var weeks = sortDescending(Object.keys(sets));
for(var i=0, wlen=weeks.length; i < wlen; i++) {
var w = weeks[i];
// get a list of days and sort them
var days = sortDescending(Object.keys(sets[w]));
var weekEntry = {
time: w,
days: []
};
items.push(weekEntry);
// now iterate the days and add entries
for(var j=0, dlen=days.length; j < dlen; j++) {
var d = days[j];
weekEntry.days.push({
time: d,
// here is the list of tasks from parseItems
items: sets[w][d]
});
}
}
console.log('sortItems', items);
return items;
}
// take the array and nest it in an object by week and then day
function parseItems(master) {
var sets = {};
angular.forEach(master, function(item) {
var week = moment(item.$priority).startOf('week').valueOf()
var day = moment(item.$priority).startOf('day').valueOf();
if( !sets.hasOwnProperty(week) ) {
sets[week] = {};
}
if( !sets[week].hasOwnProperty(day) ) {
sets[week][day] = [];
}
sets[week][day].push(item);
});
console.log('parseItems', sets);
return sets;
}
function sortDescending(list) {
return list.sort().reverse();
}
}
}
});
repeat.html模板:
<ul>
<!--
it would actually be more elegant to put this content directly in index.html
so that the view can render it, rather than needing a new directive for
each variant on this layout; transclude should take care of this but I
left it out for simplicity (let's slay one dragon at a time)
-->
<li ng-repeat="week in weeks">
<h3>{{week.time | date:"MMMM dd'th'" }}</h3>
<ul>
<li ng-repeat="day in week.days">
<h4>{{day.time | date:"MMMM dd'th'" }}</h4>
<ul>
<li ng-repeat="task in day.items">
<input type="checkbox" ng-model="task.complete" ng-change="isCompleteTask(task)">
<input ng-model="task.title" ng-change="updateTask(task)">
<span ng-click="deleteTask(task)">x</span>
</li>
</ul>
</li>
</ul>
</li>
</ul>
其他想法
最有可能的是,您只需要将所做的更改从ng-init中移出即可。我认为元素移动/重新排序时不会重新运行。
<li ng-repeat="task in list">
<h3 ng-show="priorityChanged(task.$priority)">{{getDayName(task.$priority)}}</h3>
<!-- ... -->
</li>
由于您的列表可能会重复几次,因此通过使用track by可能也可以大大提高速度
<li ng-repeat="task in list track by task.$id">
如果那不能解决问题,那么可能是时候考虑编写自己的指令了(这些指令听起来比听起来更有趣),并可能考虑搁置AngularFire并转到源代码。
您确实想要一个更深层嵌套的数据结构,可以在多个层次上进行迭代,并且您可能需要自己在客户端或服务器上进行结构化,因为您已经了解了如何组织它们(基本上是按组周功能)。
我制作了一个类 在另一个类中 正如您所看到的,我创建了这个数组,并将UImages与txt和txt2一起放置在其中。简单地说,我要向用户显示一个图像,然后输入一个描述图像的输入,然后检查它是否匹配txt和txt2。在运行模拟器时,我得到以下错误: ***由于未捕获异常“nSunKnownKeyException”而终止应用程序,原因:“[ SetValue:ForUndefinedKey:]:对于
问题内容: 例: 数组仍保留其原始值,是否可以通过迭代函数对数组元素进行写访问? 问题答案: 回调传递给元素,索引和数组本身。 编辑 -如注释中所述,该函数可以采用第二个参数,该参数将用作每次对回调的调用中的值: 第二个例子说明了自己是在回调中设置的。有人可能认为调用中涉及的数组可能是的 默认 值,但无论出于何种原因,它都不是。会如果没有提供第二个参数。 (注意:如果回调是一个函数,则上述内容不适
问题内容: 我有jQuery Accorion ID 和标头类名称中的一些内容。现在,我想给.simpleColor一个计算出的边距。用伪…看起来像这样, 我愿意使用其他任何技术(例如javascript)来实现这一目标。 问题答案: 有一个名为calc的CSS函数开始获得很好的支持。语法如下: (请注意,运算符周围的空白很重要) 这样可以在CSS中提供真正的动态计算支持。使用预处理器,您只能将静
问题内容: 我试图根据我正在阅读的教程测试python中的列表如何工作。当我尝试使用r时,口译员给了我。 请让我知道如何从这两种方法获得结果: 问题答案: 简单的升序排序非常简单,请调用sorted()函数。它返回一个新的排序列表: sorted()接受带有布尔值的反向参数。
本文向大家介绍javascript sort()对数组中的元素进行排序详解,包括了javascript sort()对数组中的元素进行排序详解的使用技巧和注意事项,需要的朋友参考一下 javascript sort()可以对数组中的元素进行排序, 语法格式:arrayObject.sort(sortby) arrayObject是数组对象,sortby为可选项,用来确定元素顺序的函数的名称,如果这
我做了一些挖掘,似乎在任何地方都找不到简单的答案,也许我找错了地方。我只想按文件的修改时间排序,从最旧到最新。这可能吗?