Angularjs 来自引导UI类型先行模板的访问控制器范围

Angularjs 来自引导UI类型先行模板的访问控制器范围,angularjs,angular-ui-bootstrap,Angularjs,Angular Ui Bootstrap,我无法使用ui typeahead从自定义模板内部调用控制器函数: <input typeahead="val for val in autoComplete($viewValue)" typeahead-template-url="searchAutocompleteTpl.html" ng-model="query"/> <script type="text/ng-template" id="searchAutocompleteTpl.html">

我无法使用ui typeahead从自定义模板内部调用控制器函数:

<input typeahead="val for val in autoComplete($viewValue)"
  typeahead-template-url="searchAutocompleteTpl.html"  
  ng-model="query"/>

<script type="text/ng-template" id="searchAutocompleteTpl.html">
  <span ng-repeat="eqp in match.model.equipment"/>
    <a href="" ng-click="showItem(eqp.model)">
      found in: {{eqp.model}}
    </a>
</script>

问题在于,模板中似乎缺少控制器的作用域:

showItem(设备型号)

从来没有人打过电话。我也尝试过:

$parent.showItem(设备模型)

无济于事


那么,我如何在控制器的作用域上调用函数/值呢?

我遇到了同样的问题,并查看了一下,看看这是否能提供任何线索。在创建建议列表的过程中,似乎涉及到几个指令,每个指令都有自己的子范围


换句话说,您的
$parent.showItem(eqp.model)
是一个很好的尝试,但是您没有提升足够的级别。对我起作用的是:
$parent.$parent.$parent.showItem(eqp.model)

问题的解决方案是在模板控制器范围内启动一个对象,如下所示:

$scope.typeaheadObject = {
   query : '',
}
现在,在您的表格中,您需要通过以下方式更改ng模型:

ng-model="typeaheadObject.query'
这将在所有控制器中创建对象typeaheadObject,如果您不在其中一个控制器中重新启动它。因此,当您想要访问此控制器中某个对象的内容时,您只需执行以下操作,例如:

console.log($scope.typeaheadObject.query)
这是angularJs中的经典问题。只有当变量存储在对象中时,才能访问和修改父范围

最后,您必须在ng模型中使用“.”。这将允许您的ui引导模块和您自己的模块与对象共享其作用域

我只是做了一个关于plunker的例子,以确保你很好地理解这个问题


祝你愉快:)

我也有同样的问题。我不确定,但它起作用了

您可以使用双
$parent
而不是单


e、 g.
$parent.$parent.showItem(eqp.model)

添加4个父项后,它对我有效。
$parent.$parent.$parent.$parent.

谢谢,但你知道为什么吗?我们在哪里可以清楚地看到作用域的结构。我花了4美元才到达原始作用域。这取决于您如何使用它以及在哪里使用它。typeahead显然在某个地方引入了一个独立的作用域,这意味着您无法从自己的父作用域进行原型继承。这就是为什么您必须使用$parent,即使在孤立的作用域中,它也是由ANGLONAL填充的。如果您在自己的指令中使用typeahead,该指令还定义了一个独立的作用域,那么您需要在$parent链上运行4次才能到达基本作用域。当然,此时您可能需要重新考虑代码。隔离作用域的要点是它可以重用,因为它不依赖于父级。