Angularjs 来自引导UI类型先行模板的访问控制器范围
我无法使用ui typeahead从自定义模板内部调用控制器函数: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">
<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次才能到达基本作用域。当然,此时您可能需要重新考虑代码。隔离作用域的要点是它可以重用,因为它不依赖于父级。