$ watch在工厂/服务值的链接功能中不会更新

时间:2015-11-03 14:51:49

标签: angularjs angularjs-directive watch

以下是我正在使用的指令,我正在尝试根据工厂中的变量更新template网址:

.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;
})

我希望能够从其他控制器添加/删除错误并让它更新指令。目前,对于$watch mostRecentError回调为undefined的初始值,它永远不会更新。我错过了什么?

2 个答案:

答案 0 :(得分:1)

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

errorHandler.getMostRecentError()

通过

errorHandler.getMostRecentError

否则,您正在将函数调用的结果视为附加到指令范围的变量。

答案 1 :(得分:1)

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

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