Angularjs 如何从角度指令调用函数

Angularjs 如何从角度指令调用函数,angularjs,angularjs-directive,Angularjs,Angularjs Directive,我试图从指令模板中调用一个函数,将时间转换为可读的内容。我目前看到的是document.write(convertTime({hour.time}))我想查看实际转换时间的位置。没有JS错误 指令: .directive('hourly',function(){ 返回{ 范围:正确, 限制:'E', 模板:“”+ 'Time:document.write(convertTime({hour.Time}}));'+ '' + “”+ 'Temp:{hour.temperature}}'+ “{ho

我试图从指令模板中调用一个函数,将时间转换为可读的内容。我目前看到的是
document.write(convertTime({hour.time}))我想查看实际转换时间的位置。没有JS错误

指令:

.directive('hourly',function(){
返回{
范围:正确,
限制:'E',
模板:“”+
'Time:document.write(convertTime({hour.Time}}));'+
'' +
“
”+ 'Temp:{hour.temperature}}
'+ “{hour.summary}}
”+ '湿度:{小时.湿度}}
'+ '压力:{hour.Pressure}}
'+ '' + '' } });
功能:

函数转换时间(time){
console.log(“在转换时间内”);
var d=新日期(时间*1000);
var小时数=d.getHours()
var minutes=d.getMinutes()
如果(分钟<10){
分钟=“0”+分钟;
}
var suffix=“AM”;
如果(小时数>=12){
后缀=“PM”;
小时=小时-12;
}
如果(小时==0){
小时=12;
}

return“+d.getMonth()+”+d.getDay()+”
“+”+hours+”:“+minutes+”+“+suffix+”您应该将您的函数放入服务中,然后您可以将该服务注入指令并使用该函数。类似于以下内容:

angular.module('myApp').factory('$utilTime', [function() {

$utilTime.convertTime = function(time) {
   //your code
  };

  return $utilTime;
}]);
然后在我们的指令中注入:

.directive('hourly', function( $utilTime) {

然后,您可以在指令中添加一个控制器,并将函数中的值设置为一个范围变量,然后在模板中使用。

您有一些问题。我不太确定您要对返回的数据执行什么操作,但我会让您进行分类。我还删除了指令中的一些内容,只是为了避免重复t调用convertTime服务

为了调用该函数,您应该将其放入服务(本例中为工厂)。(我对其进行了轻微修改,因为到目前为止,您在调用过程中做了一些错误的事情):

.factory('myFactory',function(){
返回{
convertTime:function(){
console.log(“在转换时间内”);
var d=新日期();
var小时数=d.getHours()
var minutes=d.getMinutes()
如果(分钟<10){
分钟=“0”+分钟;
}
var suffix=“AM”;
如果(小时数>=12){
后缀=“PM”;
小时=小时-12;
}
如果(小时==0){
小时=12;
}

返回“+d.getMonth()+”+d.getDay()+”
“+”“+hours+”:“+minutes+”“+suffix+”,作为设计建议,我会将一大块html放入html文件中,并在指令中使用templateUrl。如何访问hour.time变量以传递给myFactory.convertTime(hour.time)?我得到的时间基于该数据对象,而不是当前时间。所以只需将其传递到convertTime(hour.time)中即可函数,但您需要将工厂设置为使用它,而不是生成新的日期字符串。我不知道如何访问hour.time变量。它不是作用域的一部分。我确实在$scope.$parent.hour.time中看到了它,但我尝试过使用scope.$parent.hour.time,但也不起作用。我还没有完全理解directiv作为一个整体,我可以抓取整个weather.data对象,但无法将其分离到表示一小时的每个索引(基于ng repeat)。我将ngRepeat移到指令之外,这解决了问题(进行了一些小调整)。
.factory('myFactory', function() {
  return {
    convertTime: function() {
    console.log("in convert time");
    var d = new Date();
    var hours = d.getHours()
    var minutes = d.getMinutes()

    if (minutes < 10) {
        minutes = "0" + minutes;
    }
    var suffix = "AM";
    if (hours >= 12) {
        suffix = "PM";
        hours = hours - 12;
    }
    if (hours === 0) {
        hours = 12;
    }

    return "<span>" + d.getMonth() + " " + d.getDay() + "</span> <br />" + "<span>" + hours + ":" + minutes + " " + suffix + "</span";
    }
  }
})
.directive('hourly', function(myFactory, $sce) {
    return {
        scope: true,
        restrict: 'E',
        template: '<div class="hourly_container row">' +
            '<div class="col-xs-4 col-sm-4 col-md-4 col-lg-4" ng-bind-html="convertTime">Time: {{convertTime}} </div>' +
            '<div class="weather_block hourly col-xs-8 col-sm-8 col-md-8 col-lg-8">' +
            '<canvas id="weather_icon_{{$index}}" width="128" height="128"></canvas><br />' +
            '<span>Temp: {{hour.temperature}}  </span><br />' +
            '<span> {{hour.summary}} </span><br />' +
            '<span>Humidity: {{hour.humidity}} </span><br />' +
            '<span>Pressure: {{hour.pressure}} </span><br />' +
            '</div>' +
            '</div>',
            link: function(scope) {
              scope.hour = {
                temperature: 97,
                summary: 'some text here for the summary',
                humidity: 'Really Humid',
                pressure: -92137
              }
              scope.convertTime = $sce.trustAsHtml('Time: ' + myFactory.convertTime())
              }
       }

})