(这不是“哦,我忘了$scope.$apply()
”问题之一
问题是:如何使用控制器中的反应辅助函数实现ng-repeat
实时绑定?
代码说超过千言万语(我已经删除了所有内容):
index.js:
<body ng-controller="AppCtrl as app">
<!-- (...) -->
<div class="dashboard" ng-controller="DashboardCtrl as ctrl">
<ul ng-repeat="timer in app.timers">
<li>{{timer.entry.title}}</li>
</ul>
</div>
</body>
AppCtrl.js:
angular.module('spectroscope').controller('AppCtrl', ['$scope', '$reactive', '$interval',
function($scope, $reactive, $interval) {
var me = this;
// Make this reactive
$reactive(this).attach($scope);
me._timers = {};
$.each(Entry.find().fetch(), function(idx, entry) {
me._timers[entry._id] = new Timer(entry, $interval);
});
/**
* Logic for creating a new entry
*/
me.createEntry = function() {
let entry = new Entry(),
titleField = me.addEntryContainer.find('input[name=title]');
// Create new entry
entry.title = titleField.val();
entry.save();
// Create a new timer
let timer = new Timer(entry, $interval);
me._timers[entry._id] = timer;
};
// Reactive helpers
this.helpers({
/**
* Returns all timer objects
*/
timers: function() {
let timers = [];
$.each(me._timers, function(id, timer) {
timers.push(timer);
});
return timers;
}
});
}]);
一切正常:有更多代码用于启动和停止时间跟踪应用程序的计时器并显示每个条目花费的时间等,如果计时器正在运行,{{不在上面可见的代码中)时间元素1}}已更新。
问题:如果我添加新的计时器/条目(<li>
),则新创建的计时器不会显示在列表中。 AppCtrl.createEntry()
不会再次调用辅助函数。
ng-repeat
调用不起作用,因为$scope.$apply()
已经在进行中,因为该方法是由$apply
指令调用的。
我还尝试用ng-submit
替换_timer
字段,但这并未改变任何内容。
答案 0 :(得分:0)
我无法从你的代码中100%告诉你发生了什么,但看起来你并没有从Meteor minimongo系列中提取你的timers
。帮助者应该帮助您从minimongo中获取数据,而不是其他。如果您没有使用minimongo集合,只需在模板中使用me.timers而不是创建另一个数组的帮助程序。如果您使用的是minimongo集合,则可能需要实际包含minimongo命令,例如return Timers.find({})
。