【问题标题】:Modify directive controller variable from link function从链接函数修改指令控制器变量
【发布时间】:2015-03-01 20:48:47
【问题描述】:

我创建了一个封装了代码的 plunker,但由于某种原因,ng-click 无法在其中工作。 好吧,希望这足以说明我的问题。 http://plnkr.co/edit/ILbz7tMLpOgXyO0Dx6su?p=preview

所以我正在尝试创建自己的简单MessageService,它是一个服务,用于保存下一个$state 的消息(使用ui-router)。

我创建了一个小指令,我也将它包含在我的 plunker 中。 该指令在下一条路线上显示消息,但由于某种原因(我不知道)它不会触发 $timeout 函数,我将 scope.feedback 设置为 null。

正如您在我的 plunker 中看到的,我在指令模板上有一个 ng-show="feedback",我在指令控制器中填充了 MessageService.get() 以检索消息。在我的链接功能中,我想将其设置为null,以在一段时间后将其隐藏。

模板:

<div ng-show="feedback" class="feedback">
  <div class="alert feedback-message alert-success">{{feedback}}</div>
</div>

控制器功能:

$scope.$on('$stateChangeSuccess', function () {
   $scope.feedback = MessageService.get();
});

链接功能:

if (scope.feedback != null) {
   if (scope.feedback.type == 'success') {
      scope.typeClass = 'alert-success';
   } else if (scope.feedback.type == 'error') {
      scope.typeClass = 'alert-danger';
   }

   $timeout(function () {
      scope.feedback = null;
   }, 1500)
}    

如果您需要更多信息,请告诉我。

【问题讨论】:

  • 请直接在问题中发布相关代码。虽然外部演示非常有帮助,但您的问题应该是独立的,而无需离开此站点
  • 您的按钮不在MainController 的范围内。它在ui-view 之外
  • @charlietfl 我已经添加了代码并更新了我的 plunker。大声笑是的,真的很愚蠢......哈哈。演示现在正在本地工作,希望问题很清楚。

标签: javascript angularjs angularjs-directive timeout angularjs-scope


【解决方案1】:

该指令的link 函数不仅会定期自动执行,它也不知道statechangeSuccess 事件何时发生。它只会在指令呈现(编译)时运行。只需将其隐藏在 $stateChangeSuccess 本身上即可。

$scope.$on('$stateChangeSuccess', function () {
    $scope.feedback = MessageService.get();
     $timeout(function () {
        $scope.feedback = null;
    }, 1500)
});

或者只是在控制器上添加一个方法(或者你也可以在作用域上添加它)

var _this = this;
$scope.$on('$stateChangeSuccess', function () {
    $scope.feedback = MessageService.get();
    $timeout(_this.hideFeedBack, 1500); //Invoke it here
});

_this.hideFeedBack = function(){
    $scope.feedback = null;
 }

并且还可以使用给出控制器实例的第四个参数在链接函数中访问它。

 link: function (scope, el, attrs, ctrl) {

Demo

【讨论】:

  • 我已经将它移到了我的控制器中,但它看起来并没有等待$timeout。我已将超时设置为 2500,感觉它在 0.5 秒后消失了。好吧,它现在可以工作了。
  • 当然。你看到我的demo了吗?我认为您可能正在执行该功能而不是设置参考。如果您发现任何问题,可以给我演示一下吗?
猜你喜欢
  • 1970-01-01
  • 2016-08-28
  • 2016-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-11
  • 1970-01-01
相关资源
最近更新 更多