2016-11-07 28 views
0

似乎有很多相关的问题 - 但是,我已经尝试过所有解决方案都无济于事。使用Angular typeahead指令时,控制台显示错误“指令模板”uibTypeaheadPopup'必须只有一个根元素。“

让我来讨论这个问题开始,我已经试过:

我简直复制并从官方的角度引导网站

HTML

<input type="text" ng-model="selected" uib-typeahead="state for state in states | filter:$viewValue | limitTo:8" class="form-control">

粘贴示例

控制器

$scope.states = [...]; // omitted for brevity

而且我得到了以下错误:

Error: [$compile:tplrt] Template for directive 'uibTypeaheadPopup' must have exactly one root element. uib/template/typeahead/typeahead-popup.html

我不知道,如果是相关的,但这些都是涉及到的相关库版本: - 引导CSS 3.3.7 - jQuery的3.1.1 - Bootstrap.js 3.3.7 - 角1.5.7(我在这里使用角1) - 角引导2.2.0

我试了一下:

尝试1:在div标签结束语,因为它会再有“一个根元素”。

尝试2:将ui-bootstrap-tpls.js角度引导模板文件中的div标签中的模板(typeahead-popup.html)包裹起来。

尝试3:我试着从模板文件中删除所有'\ n',因为我偶然发现了一个网站,建议将此作为解决方法。该模板看起来有点像这样在源文件中,我摆脱了所有的\n S的的:

angular.module("uib/template/typeahead/typeahead-popup.html", []).run(["$templateCache", function($templateCache) { 
$templateCache.put("uib/template/typeahead/typeahead-popup.html", 
"<ul class=\"dropdown-menu\" ng-show=\"isOpen() && !moveInProgress\" ng-style=\"{top: position().top+'px', left: position().left+'px'}\" role=\"listbox\" aria-hidden=\"{{!isOpen()}}\">**\n**" + 
" <li class=\"uib-typeahead-match\" ng-repeat=\"match in matches track by $index\" ng-class=\"{active: isActive($index) }\" ng-mouseenter=\"selectActive($index)\" ng-click=\"selectMatch($index, $event)\" role=\"option\" id=\"{{::match.id}}\">**\n**" + 
"  <div uib-typeahead-match index=\"$index\" match=\"match\" query=\"query\" template-url=\"templateUrl\"></div>**\n**" + 
" </li>**\n**" + 
"</ul>**\n**" + 
""); 
}]); 

尝试4:然后我想到了我的模板系统,并认为我可能有标记,没有妥善关闭。初步检查发现在<html>标记的顶部添加了一个<!DOCTYPE html>标记,我已将其删除,但无济于事。我没有看到任何未正确关闭的标签。

尝试5:我认为这可能与我使用node.js运行项目有关,所以不是运行localhost,而是将所有的javascript库从相对路​​径替换为CDN ,我的项目文件使用绝对路径并直接在浏览器中打开,但我在Chrome和Firefox中遇到了跨源问题。

我的<head>部分看起来像这样。

<head> 
    <!--<link rel='stylesheet' href='/stylesheets/style.css' />--> 
    <!--<link href="javascripts/bower_components/bootstrap/dist/css/bootstrap.css" rel="stylesheet"> &lt;!&ndash;3.3.7&ndash;&gt;--> 
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous"> 


    <!--<script src="javascripts/bower_components/jquery/dist/jquery.js"></script> &lt;!&ndash;3.1.1&ndash;&gt;--> 
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script> 

    <!--<script src="javascripts/bower_components/bootstrap/dist/js/bootstrap.js"></script> &lt;!&ndash;3.3.7&ndash;&gt;--> 
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script> 

    <!--<script src="javascripts/bower_components/angular/angular.js"></script> &lt;!&ndash;1.5.8&ndash;&gt;--> 
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.8/angular.js"></script> 


    <!--<script src="javascripts/bower_components/angular-bootstrap/ui-bootstrap.js"></script> &lt;!&ndash;2.2.0&ndash;&gt;--> 
    <!--<script src="https://github.com/angular-ui/bootstrap/blob/gh-pages/ui-bootstrap-tpls-2.2.0.min.js"></script>--> 
    <script src="/Users/Baggio/WebstormProjects/Scratchpad/public/javascripts/bower_components/angular-bootstrap/ui-bootstrap.js"></script> <!--2.2.0--> 


    <script src="/Users/Baggio/WebstormProjects/Scratchpad/public/javascripts/AppCtrl.js"></script> 

尝试6:删除注释,按角的官方文档。我尝试删除相关文件中的所有注释(我正在使用ui-router进行路由,所以对于我的项目,它是主页,并且子状态的直接模板嵌套在一层以下)。但是,它似乎没有办法。

尝试7:我尝试复制项目并剥离到它的基本要素,所以我只有一个HTML(或ejs作为模板系统,我正在使用)页面和一个JavaScript文件的项目,但显示相同的错误(...必须只有一个根元素)。

HTML

<html> 
<head> 
... // references included under "Attempt 5" 
</head> 
    <body ng-app="ctl" ng-controller="AppCtrl"> 
    <div> 
     <input type="text" ng-model="selected" uib-typeahead="state for state in states" class="form-control"> 
    </div> 
    </body> 
</html> 

JS

angular.module("ctl", 
    [ 
     'ui.bootstrap' 
    ]) 
    .controller("AppCtrl", AppCtrl); 

AppCtrl.$inject = ["$scope", "$log"]; 

function AppCtrl($scope, $log) { 
    $scope.states = [...]; // omitted for brevity 
} 

我觉得我失去了一些东西很明显,但我无法弄清楚它是什么......希望得到一些帮助。

回答

0

其实我只是点击了SO AngularJS - "Error: Template must have exactly one root element" when using Angular-UI Typeahead建议的链接,得到了我的答案。

这是非常基本的东西......正如AndrewD和mattwad所建议的那样,这只是包含正确的依赖关系和正确的JS文件的问题,我错过了这两个文件。

具体来说, UI的自举tpls.js(模板文件) [“ui.bootstrap.tpls”(依赖)

不知道这是适当的,以保持这个问题,但有人可能仍然认为这有帮助吗?

相关问题