我正在阅读angularjs的开发者指南,我对代码有一些疑问 https://docs.angularjs.org/guide/directive
angular.module('docsTimeDirective', [])
.controller('Controller', ['$scope', function($scope) {
$scope.format = 'M/d/yy h:mm:ss a';
}])
.directive('myCurrentTime', ['$interval', 'dateFilter', function($interval, dateFilter) {
function link(scope, element, attrs) {
var format,
timeoutId;
function updateTime() {
element.text(dateFilter(new Date(), format));
}
scope.$watch(attrs.myCurrentTime, function(value) {
format = value;
updateTime();
});
element.on('$destroy', function() {
$interval.cancel(timeoutId);
});
// start the UI update process; save the timeoutId for canceling
timeoutId = $interval(function() {
updateTime(); // update DOM
}, 1000);
}
return {
link: link
};
}]);
<div ng-controller="Controller">
Date format: <input ng-model="format"> <hr/>
Current time is: <span my-current-time="format"></span>
</div>
&#34;格式&#34;在my-current-time =&#34;格式&#34;绑定到格式模型?因为my-current-time =&#34;格式&#34;不是我的当前时间=&#34; {{format}}&#34;。那怎么做?
function updateTime() {
element.text(dateFilter(new Date(), format));
}
了解控制器中的$ scope.format? &#34;格式&#34;变量应该引用链接函数中新创建的变量,但我不知道该变量如何绑定到Controller中的$ scope.format。
答案 0 :(得分:0)
所以(据我所知)指令中的属性可以通过以下方式工作:
'='
在隔离范围对象中使用;
表达式必须是左手值/可分配的)'&'
;表达式不必是左手值/可赋值)'@'
)$observe
属性,或者,在这种情况下,$watch
。如果我的控制器中某处有$scope.a = 123
,则取决于程序员如何连接指令/属性,我可能会my-attribute="a"
或my-attribute="{{a}}"
或属性可能不会除了视图中实际存在的任何字符串外,接受任何内容。
在这种情况下,字符串为$watch
- 编辑:
// attrs is the attributes object I mention in bullet point 4.
// myCurrentTime is camel-case for hypenated-snake-case my-current-time;
// Angular does this conversion for you automatically.
scope.$watch(attrs.myCurrentTime, function(value) {
format = value;
updateTime();
});
每当$digest
周期发生(通常每次发生变化)都涉及scope
时,将执行提供的function
,然后更新时间。
我希望有所帮助。
答案 1 :(得分:0)
以下格式仍然是本地变量格式。 newFormatValue是$ scope.format的新值:
...
scope.$watch(attrs.myCurrentTime, function(newFormatValue) {
format = newFormatValue;
updateTime(value);
});
在这种情况下, attrs.myCurrentTime 是 my-current-time属性的值,即&#34; 格式 &#34 ;.
$ watch()的第一个参数是针对 $ scope context 评估的表达式;因此,当角度评估&#34;格式&#34;它确实看到&#34; $ scope.format&#34;。 当观察到的表达式的结果发生更改时,侦听器(第二个参数)将被执行。
您需要存储&#39; newFormatValue&#39;因为每1000毫秒你就有这个:
...
// start the UI update process; save the timeoutId for canceling
timeoutId = $interval(function() {
updateTime(); // update DOM
}, 1000);
它正在调用updateTime()。并且格式可能在某个时间未定义。因此,使用newFormatValue设置格式会更新本地格式变量,并且每1000毫秒使用一次。
&#34;格式&#34;在my-current-time =&#34;格式&#34;绑定到格式模型? 因为你的HTML有这个:
<input ng-model="format">
ng-model指令将以某种方式在此过程中调用 $ digest()。当$ digest()发生时,它会检查所有观察到的表达式。如果监视表达式的结果发生更改,则会执行侦听器。在你的情况下:
scope.$watch(attrs.myCurrentTime, listener)
听众是你的:
function(value(){}