如何在控制器外部和视图内在 AngularJs 中运行 jQuery
How can I run jQuery in AngularJs outside of a controller and inside a view?
我正在一个角度种子之上构建一个代码片段库,并使用Jade/Gulp进行编译。目标是在给定页面上拥有可重用代码的工作/实时示例集合的各种类别/页面,用户还可以复制相关的 scss、jade、html 等以用于其他项目(几乎与波旁补充装网站相同 - http://refills.bourbon.io/)
我正在使用玉石混合来呈现类别页面上的每个片段。
mixin snippet(category, title, url)
.snippet-container
// Title of Snippet
// Snippet Markup (HTML)
.snippet-markup(ng-include="'app/snippets/#{category}/#{url}/markup.html'")
// Snippet Copy Table / Raw Resources
.refill-snippet
.refill-control
a.snippet-link-toggle(ng-click="showSnippet-!{url}=true" ng-hide="showSnippet-!{url}") Show Code
a.snippet-link-toggle(ng-click="showSnippet-!{url}=false" ng-show="showSnippet-!{url}") Hide Code
table.snippets-table(ng-show="showSnippet-!{url}")
tbody
tr
// Markup Column HTML / Jade
td.snippet
.copy-source-container
a.copy-source(ngclipboard='', data-clipboard-target='#jade') Copy Jade
pre.language-markup
code#jade.language-jade(prism ng-include="'master/snippets/#{category}/#{url}/_jade.html'")
// Styles Column SCSS,SASS/LESS/CSS
td.snippet
.copy-source-container
a.copy-source(ngclipboard='', data-clipboard-target='#scss') Copy Scss
pre.language-markup
code#scss.language-sass(prism ng-include="'master/snippets/#{category}/#{url}/_scss.scss'")
// Scripts Column Javascript, jQuery, CoffeeScript
td.snippet
.copy-source-container
a.copy-source(ngclipboard='', data-clipboard-target='#js-1') Copy JavaScript
pre.language-markup
code#js-1.language-javascript(prism ng-include="'master/snippets/#{category}/#{url}/_js.js'")
然后引用给定类别视图上的每个代码段,如下所示:
include mixins
部分
// Tabs 1
+snippet('accordions-tabs', 'Accordions 1', 'tabs-1')
// Tabs 2
+snippet('accordions-tabs', 'Accordions 2', 'tabs-2')
我试图克服的问题/障碍是获取每个代码片段在页面上运行所需的javascript/jQuery。有没有办法将代码片段所需的所有 JS 包含在一个包含的.js文件中,并让它在我的 angular 应用程序中工作?(我已经尝试过这个,但无济于事)。或者我是否仅限于从控制器内运行javascript/jQuery,我需要找到某种方式将JS从模板/视图传递到控制器中?
下面是代码段的标记示例:
<ul class="accordion-tabs">
<li class="tab-header-and-content"></li>
<a href="javascript:void(0)" class="is-active tab-link">Tab Item</a>
<div class="tab-content">
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras tincidunt pellentesque lorem, id suscipit
dolor rutrum id. Morbi facilisis porta volutpat. Fusce adipiscing, mauris quis congue tincidunt, sapien
purus
suscipit odio, quis dictum
odio tortor in sem. Ut sit amet libero nec orci mattis fringilla. Praesent eu ipsum in sapien tincidunt
molestie
sed ut magna. Nam accumsan dui at orci rhoncus pharetra tincidunt elit ullamcorper. Sed ac mauris ipsum.
Nullam
imperdiet sapien id
purus pretium id aliquam mi ullamcorper.</p>
</div>
<li class="tab-header-and-content"></li>
<a href="javascript:void(0)" class="tab-link">Another Tab</a>
<div class="tab-content">
<p>Ut laoreet augue et neque pretium non sagittis nibh pulvinar. Etiam ornare tincidunt orci quis ultrices.
Pellentesque ac sapien ac purus gravida ullamcorper. Duis rhoncus sodales lacus, vitae adipiscing tellus
pharetra sed. Praesent bibendum
lacus quis metus condimentum ac accumsan orci vulputate. Aenean fringilla massa vitae metus facilisis
congue. Morbi placerat eros ac sapien semper pulvinar. Vestibulum facilisis, ligula a molestie venenatis,
metus justo ullamcorper ipsum, congue
aliquet dolor tortor eu neque. Sed imperdiet, nibh ut vestibulum tempor, nibh dui volutpat lacus, vel
gravida magna justo sit amet quam. Quisque tincidunt ligula at nisl imperdiet sagittis. Morbi rutrum tempor
arcu, non ultrices sem semper a. Aliquam
quis sem mi.</p>
</div>
<li class="tab-header-and-content"></li>
<a href="javascript:void(0)" class="tab-link">Third</a>
<div class="tab-content">
<p>Donec mattis mauris gravida metus laoreet non rutrum sem viverra. Aenean nibh libero, viverra vel vestibulum
in, porttitor ut sapien. Phasellus tempor lorem id justo ornare tincidunt. Nulla faucibus, purus eu placerat
fermentum, velit mi iaculis
nunc, bibendum tincidunt ipsum justo eu mauris. Nulla facilisi. Vestibulum vel lectus ac purus tempus
suscipit nec sit amet eros. Nullam fringilla, enim eu lobortis dapibus, quam magna tincidunt nibh, sit amet
imperdiet dolor justo congue turpis.</p></div>
<li class="tab-header-and-content"></li>
<a href="javascript:void(0)" class="tab-link">Last Item</a>
<div class="tab-content">
<p>Sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Phasellus dui urna...</p>
</div>
以及所需的 jQuery:
$(document).ready(function () {
$('.accordion-tabs').each(function (index) {
$(this).children('li').first().children('a').addClass('is-active').next().addClass('is-open').show();
});
$('.accordion-tabs').on('click', 'li > a.tab-link', function (event) {
if (!$(this).hasClass('is-active')) {
event.preventDefault();
var accordionTabs = $(this).closest('.accordion-tabs');
accordionTabs.find('.is-open').removeClass('is-open').hide();
$(this).next().toggleClass('is-open').toggle();
accordionTabs.find('.is-active').removeClass('is-active');
$(this).addClass('is-active');
} else {
event.preventDefault();
}
});
});
导入说明 - 我可以通过手动将其放置在控制器中并使 JS 适用于代码片段并将所有 jQuery 选择器修改为角度选择器,但这违背了此代码片段库的目的,因为并非所有项目都将在角度应用程序中运行。
对此事的任何见解将不胜感激!
原则上这很容易,您只需将angular.element
分配给全局$
,这就是您所需要的:
window.$ = angular.element;
$('#somediv').html('<p>ipsum lorem</p>');
但是,Angular 只包含一个名为 jqLite 的严重阉割的 jQuery 版本,这不适用于您的代码,因为它不支持(除其他外)通过查询选择器进行选择。上面的代码只会抛出:
未捕获的错误: [jqLite:nosel] http://errors.angularjs.org/1.4.0/jqLite/nosel
在浏览器 Javascript 控制台上。但是,有一个$(document).ready()
,您可以使用它。
为了说明这一点,我整理了一个JSBin示例,它有两个<div>
,一个由Angular绑定,一个由jQuery填充(由于"nosel"没有选择器错误,这永远不会发生)。
$(document).ready()
会记录到控制台,因此您可以看到它是否受支持。
现在,通常,我在项目中使用来自CDN的完整jQuery和Angular。对于大多数访问者来说,这是一个HTTP状态304
它比jqLite更有用,即使我自己尽量不操纵DOM。
我混合了两者,唯一的要求是按以下顺序加载脚本:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js">//jQuery</script>
<script type="text/javascript" src="script/jQuery.js">//Flow and animations my script</script>
<script src="script/lib/angular.min.js">//AngularJS</script>
<script src="script/lib/angular-fullscreen.js">//AngularJS-fullscreen</script>
<script src="script/menuContent.js">//...Controller_for_AngularJS</script>
Angular 和 jQuery 之间的所有交互都是在文档 DOM 状态(视图状态 ;))中完成的
- Angularjs代码未在匿名函数中运行
- 如何在angularJS中运行for循环而不使用html标记
- angularjs ng点击运行时标记不起作用
- 正在尝试让AngularJS/SCSS代码笔在本地运行.
- 使用 angularjs 在 24 小时后自动运行弹出窗口
- 在子控制器中触发时,Ionic AngularJS父动画未正确运行
- Angularjs推迟了日志运行计时器任务
- AngularJS这样的开源Javascript是如何在客户端浏览器上运行的
- AngularJS/Protactor:使用角种子基本应用程序运行量角器时出错
- 如何在Eclipse中运行和调试AngularJS应用程序
- AngularJS:为什么ng show没有在IE11上运行
- angularjs$q在序列上运行多个promise
- Angularjs,在运行时设置价值服务的值
- 何时使用 yeoman angularjs 运行测试
- 如何在控制器外部和视图内在 AngularJs 中运行 jQuery
- 如何在 angularjs 中运行从服务器端拉取的 js 代码
- AngularJS运行执行函数
- AngularJS运行函数两次,尽管控制器只被初始化一次
- Angularjs运行命名函数
- 强制Angular 2子模块中的服务实例化(AngularJS运行块的替代方案)