link 函数中的 $watch 在 factory/service 值上未更新

$watch in a link function on a factory/service value is not updated

下面是我正在使用的指令,我试图根据工厂中的变量更新 template URL:

.directive('poGenericNotification',['errorHandler', function(errorHandler) {
return {
  controller: 'ErmModalCtrl',
  restrict: 'EA',
  scope: {
    title: '=',
    errorList: '=',
    errMsg: '=',
    error: '=',
    info: '=',
    numNotifications: '=',
    messageOverflow: '='
  },
  template: "<div ng-include='getTemplateUrl()' class='generic-notif-container' ng-click='openErm()'></div>",
  transclude: true,
  link: function(scope) {
    scope.$watch(errorHandler.getMostRecentError(), function(mostRecentError) {
      scope.getTemplateUrl = function() {
        if (mostRecentError.type === "Alert") {
          return 'src/alerts/templates/error-alert.html';
        }
        else if (mostRecentError.type === "Info") {
          return 'src/alerts/templates/info-alert.html';
        }
      }
    }, true);
    }
  }
}])

这是它引用的工厂:

.factory('errorHandler', function () {
var errorArray = [];
var mostRecentError = {
  type:'', message: '', timestamp: ''
};
function compareObjs(a,b) {
   //sorting function
}
errorArray.addError = (function (type, message) {
  var timestamp = Date.now();
  errorArray.push({type: type, message: message, timestamp: timestamp});
  errorArray.sort(compareObjs);
  errorArray.generateMostRecentError();
});
//....some functions
errorArray.generateMostRecentError = function() {
  if (errorArray[0].message.length > 138) {
    mostRecentError.message = errorArray[0].message.slice(0, 138) + "...";
    messageOverflow = true;
  } else {
    mostRecentError.message = errorArray[0].message;
    messageOverflow = false;
  }
  mostRecentError.type = errorArray[0].type;
  mostRecentError.timestamp = errorArray[0].timestamp;
  console.log(mostRecentError);
}
errorArray.getMostRecentError = function() {
  console.log(mostRecentError);
  return mostRecentError;
}
return errorArray;
})

我希望能够 add/remove 来自其他控制器的错误并让它更新指令。目前,$watch mostRecentError 回调的初始值是 undefined,然后它永远不会更新。我错过了什么?

要在每个摘要循环中调用该函数,您应该替换

errorHandler.getMostRecentError()

来自

errorHandler.getMostRecentError

否则,您会将函数调用的结果作为附加到指令范围的变量来观察。

您需要将函数传递给 $watch 而不是其结果。更改为:

scope.$watch(errorHandler.getMostRecentError, ...);