从控制器传递回调到指令的问题

时间:2014-09-08 20:21:40

标签: angularjs angularjs-directive

我正在尝试将函数从控制器传递给指令,因此从指令触发的事件可能会导致在不同的控制器中刷新。

controllers.controller('UserCtrl', function ($scope) {
  $scope.name="Name";
  $scope.test = function (t) {
    console.log("Inside "+t+" "+$scope.name)
    return $scope.test2();
  };
  $scope.test2 = function(){
    return 2;
  }
}

<my-test-directive respond="test">

这似乎工作正常但是当我更改它以尝试匹配Google Angular conventions时,我在返回this.test2();时收到一个未定义的错误。这是一个带有失败版本的plunker

使用“Google Angular样式”我将如何处理?

3 个答案:

答案 0 :(得分:2)

当您在javascript中传递函数时,函数的上下文会丢失,因此this键盘不再起作用。如果要传递测试函数,则需要将其包装在绑定到userCtrl的函数中。您可以通过将以下行添加到控制器的构造函数并将bind()传递到您的指令而不是boundTest

,使用test执行此操作
this.boundTest = this.test.bind(this);

请注意,bind()已在ES5中引入,因此无法在IE8中使用

这是一个有效的工作人员http://plnkr.co/edit/BTuwTFf2XsmrR3As4x1x?p=preview

答案 1 :(得分:2)

请参见此处:http://plnkr.co/edit/Mugs2C7UOjlXx1L3LsMP?p=preview

你需要改变一些事情:

  1. 要从指令调用函数,您应该使用'&amp;'而是'='
  2. 在您的html更改respond="userController.test"respond="userController.test(msg)"
  3. 最后你应该将对象传递给字符串更改scope.respond("So I should be getting inside");的函数instad到scope.respond({msg:"So I should be getting inside"})
  4. 我希望这会有所帮助。

答案 2 :(得分:0)

这是what I came up with

感谢抢夺这个想法,我不知道我喜欢这个,但有两个原因......

1。)我似乎无法使用原型,限制我的继承选项(据我所知) 2.)这看起来相当hacky

$scope.userController.test2();

根据投票数量和评论将取决于我标记的答案,所以请提供反馈