【发布时间】:2016-04-04 09:05:27
【问题描述】:
我正在为基于特定属性的自定义指令使用角度一次性绑定 (relative)
这是我的指令:
app.directive('relative', ['$timeout', '$filter', '$compile', function ($timeout, $filter, $compile) {
var dateFilter = $filter('date');
return {
restrict: 'A',
scope: {
datetime: '@'
},
link: function ($scope, $element, $attributes) {
var timeout;
$scope.$watch('datetime', function (dateString) {
$timeout.cancel(timeout);
var date = (dateString || $element.text()) * 1000;
if (!date) return;
date = new Date(date);
if (!date) return;
function update() {
var reference = new Date();
$element.text(prettyDate(date));
//Calculate the next update
var diff = Math.abs(date - reference) / 1000;
var delta;
if (diff < 45) {
delta = 45 - diff;
} else if (diff < 90) {
delta = 90 - diff;
} else if (diff < 45 * 60) {
delta = 60 - (diff + 30e3) % 60;
} else {
delta = 3660 - diff % 3600;
}
timeout = $timeout(update, delta * 1000);
}
update();
$element.on('$destroy', function () {
$timeout.cancel(timeout);
});
});
}
};
}]);
这就是我使用它的方式:
<time relative datetime="{{ notice.date }}"></time>
或者:
<time relative datetime="{{ ::notice.date }}"></time>
问题是:当使用一次性绑定时,如何避免为 datetime 属性创建监视,因为该值永远不会改变? Angular 会自动完成吗?
【问题讨论】:
-
你自己创建一个watcher,绑定值后可以自己移除,以防一次性绑定。如果你有自己的观察者,
datetime: '@'毫无意义。
标签: angularjs angularjs-directive binding