【问题标题】:Accessing controller from compile function in directives从指令中的编译函数访问控制器
【发布时间】:2017-06-02 10:56:49
【问题描述】:

我搜遍了,唯一能想到的就是我不了解编译功能如何工作的基本知识。

这就是我所拥有的

angular.module("app", [])
.directive("foo", function(){
  return {
    scope: {},
    controller: function() {
      this.someValue = 23;
    },
    contollerAs: "ctrl",
    compile: function(tElem, tAttrs) {
      tElem.html("<h1>Data:  {{ctrl.someValue}}</h1>");
    },
    template: '<h1>test</h1>'
  }
});

这显示:数据:,似乎没有看到“someValue”变量。 但是,当我使用范围而不是 controllerAs 语法时,它可以工作。

//this works fine
angular.module("app", [])
.directive("foo", function(){
  return {
    scope: {},
    controller: function($scope) {
      $scope.someValue = 23;
    },
    contollerAs: "ctrl",
    compile: function(tElem, tAttrs) {
      tElem.html("<h1>Data:  {{someValue}}</h1>");
    },
    template: '<h1>test</h1>'
  }
});

这显示:数据:23

我在这里缺少什么吗?我是否正确使用编译? 手册似乎没有那么有用。

【问题讨论】:

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


    【解决方案1】:

    因为有错别字。是controllerAs,不是contollerAs

    建议使用template function 而不是compile。这使得将来升级到组件更容易,也可以避免问题 - 如果没有虚拟 &lt;h1&gt;test&lt;/h1&gt; 模板,上述指令中的 compile 将无法正常工作。

    【讨论】:

    • 哇,完全尴尬。我不敢相信在盯着那段代码 2 小时后我没有看到这一点!如果可能的话,您能否解释一下 compile 函数的目的是什么。如果链接、控制器和模板处理所有事情,它会被用来做什么。它有用例吗?
    • 这是一个品味和实际问题。 compile 的目的是修改模板并返回 pre-link 和/或 post-link 函数。我相信它在template 功能之前就已经存在,并且由于历史原因而存在。通常templatecontroller 和/或链接函数(1.5+ 中的$onInit 和$postLink 控制器挂钩)可以完成这项工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-13
    • 1970-01-01
    相关资源
    最近更新 更多