- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试构建一个模块化的 ngInclude。我的意思是 ngIncluded JSP 将引入它需要的所有依赖项并在呈现之前重新编译自身。
同一个文件在一个页面上多次使用。主页有几个选项卡 - 所有这些选项卡都使用这个 ngInclude 只是一些不同的查询字符串参数。此外,在每一页上,我都有一个包含文件的“预览”版本,然后当他们单击预览时,会弹出一个模式,它再次 ngIncludes 相同的文件,但有另一个查询字符串参数,将其置于编辑模式.
除了 IE9 (gah),我已经让它在任何地方都能工作,而且,当然,我必须支持 IE9 并且必须重构所有内容。因为想要使这个 ngInclude 模块化并让它包含所有自己的依赖项,所以每次它被 ngIncluded 时它都会再次引入那些相同的依赖项。这在更优雅地处理该问题的更现代的浏览器中很好,但在 IE9 中,它会因 multiple directives asking for template
或 multiple directives asking for transclusion
而崩溃。我能找到的唯一适用于我的情况的线索表明,这是因为依赖项被多次拉入。而且,到目前为止,我已经能够开始工作,我已经确认这似乎是事实。
所以,我来了。我试图通过只引入一次依赖项(使用 RequireJS)来完成这项工作。我没有使用路线。我让它在初始页面加载时工作,但是一旦我更改选项卡或打开编辑模式(这两个操作都会导致另一个 ngInclude),我什么也得不到。我真的得到了一个空白页。
我已经放入 console.log
并且可以看到操作的顺序是应该的(点击我的重新编译指令,它一直通过 $ compile
然后内部指令被命中)。我还可以使用浏览器控制台访问 $('selectorForController').scope().items
或 $('selectorForController').scope().params
并确认他们有我期望的数据。问题是由于某种原因 View 没有更新(这是我期望 $compile
触发的)。
应用定义:
var providers = {};
var myApp = angular.module('myApp', ['ngSanitize', 'ngAnimate', 'ngResource', 'pascalprecht.translate', 'angularFileUpload', function($controllerProvider, $compileProvider, $provide) {
providers = {
$controllerProvider : $controllerProvider,
$compileProvider : $compileProvider,
$provide : $provide
};
}]);
var queueLen = myApp._invokeQueue.length;
ngIncluded JSP:
<jsp:include page="profileIncludeListTemplate.jsp"/> <%-- Contains the profileItemList.jsp ng-template --%>
<jsp:include page="profileIncludePanelTemplate.jsp"/> <%-- Contains the profileItemPageRightPanel.jsp ng-template --%>
<script type="text/javascript">
// Define itemsData and params here
</script>
<%-- One of my iterations was trying to use a directive I called lazyscript to load in all of the dependencies and then recompile, but that didn't work --%>
<%--<lazyscript data-src="/assets/js/profile/profileItemPageService.js"></lazyscript>--%>
<%--<lazyscript data-src="/assets/js/profile/profileItemService.js"></lazyscript>--%>
<%--<lazyscript data-src="/assets/js/profile/profileIncludeController.js"></lazyscript>--%>
<%--<lazyscript data-src="/assets/js/profile/profileIncludeDirectives.js"></lazyscript>--%>
<%-- Another iteration was trying to get it to work this way, where I also wrote a directive to overload the default script tag and recompile if necessary, but that didn't work either --%>
<%--<script src="/assets/js/profile/profileItemPageService.js" type="text/javascript"></script>--%>
<%--<script src="/assets/js/profile/profileItemService.js" type="text/javascript"></script>--%>
<%--<script src="/assets/js/profile/profileIncludeDirectives.js" type="text/javascript"></script>--%>
<%--<script src="/assets/js/profile/profileIncludeController.js" type="text/javascript"></script>--%>
<%-- I can't define the ngController here because it will throw an error on initial load and stop the rest of the execution, so I have the recompile apply it --%>
<%-- So I ultimately settled on this, which defines which dependencies need to be pulled in so that I can hand that list to Require --%>
<div
data-recompile
data-recompile-controller="ProfileIncludeCtrl"
data-recompile-dependencies="/assets/js/profile/profileItemPageService.js,/assets/js/profile/profileItemService.js,/assets/js/profile/profileIncludeController.js,/assets/js/profile/profileIncludeDirectives.js"
data-recompile-finished="false"
class="profile-include"
data-ng-class="{'form-horizontal': !params.edit}">
<profile-item-list-directive></profile-item-list-directive>
<profile-item-page-right-panel-directive></profile-item-page-right-panel-directive>
</div>
重新编译指令:
myApp.directive('recompile', function($window, $q) {
return {
restrict: 'A',
link: function ($scope, elem, attrs) {
if($(elem).attr('data-recompile-finished') == 'true') return;
var dependencies = $(elem).attr('data-recompile-dependencies').split(',');
function recompiler() {
$(elem).attr('data-recompile-finished', 'true');
$(elem).attr('data-ng-controller', $(elem).attr('data-recompile-controller')); // Link the angular controller
var queue = myApp._invokeQueue;
for (var i = queueLen; i < queue.length; i++) {
var call = queue[i];
var provider = providers[call[0]];
if (provider) {
provider[call[1]].apply(provider, call[2]);
}
}
if ($('[data-ng-app="myApp"]').injector()) {
$('[data-ng-app="myApp"]').injector().invoke(function ($compile, $rootScope) {
$compile($(elem))($rootScope);
});
}
}
requirejs(dependencies, recompiler);
}
};
});
外部 Controller 的相关部分(在 profileIncludeController.js
中定义):
myApp.controller('ProfileIncludeCtrl', function($scope, $rootScope, $resource, $timeout, ProfileItemService, ProfileItemPageService) {
$scope.items = [];
$scope.params = [];
$scope.params = buildParamsObject(params);
$scope.items = itemsData.data || [];
});
指令的相关部分(在 profileIncludeDirectives.js
中定义)。这些指令被包含在内,因为它们需要能够访问彼此的范围以及 ProfileIncludeCtrl
中的一些函数,因为这些函数实际上并不属于任何一个指令。
myApp.directive('profileItemListDirective', function($rootScope, $timeout) {
return {
restrict : 'E',
templateUrl : 'profileItemList.jsp',
replace: true,
transclude : true,
scope : true,
controller : function($scope, ProfileItemService, ProfileItemPageService) {
console.log("listDirective controller");
},
link : function($scope, element, attrs) {
console.log("listDirective link");
}
};
});
myApp.directive('profileItemPageRightPanelDirective', function($rootScope, $timeout) {
return {
restrict : 'E',
templateUrl : 'profileItemPageRightPanel.jsp',
replace: true,
transclude : true,
scope : true,
controller : function($scope, ProfileItemService, ProfileItemPageService) {
console.log("panelDirective controller");
},
link : function($scope, element, attrs) {
console.log("panelDirective link");
// $scope.params is not defined here, but I need and expect it to be
}
};
});
如有任何指导,我们将不胜感激!
最佳答案
事实证明,我可以通过稍微更改重新编译功能来修复它。使用 $controller
服务并将 $ngControllerController
数据属性放在子项上是实现它的主要思想。
function recompiler() {
var ctrl = $elem.attr('data-recompile-controller');
$elem.attr('data-ng-controller', ctrl); // This is for aesthetics only
$elem.removeAttr("data-recompile")
.removeAttr("recompile")
.removeAttr("data-recompile-controller")
.removeAttr("recompile-controller")
.removeAttr("data-recompile-dependencies")
.removeAttr("recompile-dependencies");
var queue = myApp._invokeQueue;
for (var i = 0; i < queue.length; i++) {
var call = queue[i];
var provider = providers[call[0]];
if (provider) {
provider[call[1]].apply(provider, call[2]);
}
}
var templateCtrl = $controller( ctrl, { $scope: $scope } );
$elem.children().data('$ngControllerController', templateCtrl);
$compile( $elem.contents() )( $scope );
}
关于javascript - Angular Multiple ngIncludes 包含页面丢失范围(?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30785689/
我正在尝试在项目中学习和添加 Angular 国际化。我只能理解 Angular 文档 (https://angular.io/guide/i18n-overview) 的编译时翻译。 我需要这样的东
在我的 Angular 应用程序中,基于登录用户,我想通过显示/隐藏不同的菜单项或允许/禁止某些路由来授予或限制功能。 目前成功登录后,我的 .NET Core API 会返回一个 JWT token
我是 Angular 的新手,目前我已经看过 angular.io 网站提供的一些示例。但是在component decorator在文档中的解释,它指出 Angular components are
这里是service employee-service.service.ts的代码 import { Injectable } from '@angular/core'; import { HttpC
我目前正在使用@angular/http URLSearchParams 类来检索 URL 参数。在 Angular 5 中,注意到这已被弃用,但我没有看到以我当前使用的方式替换 URLSearchP
我目前正在使用@angular/http URLSearchParams 类来检索 URL 参数。在 Angular 5 中,注意到这已被弃用,但我没有看到以我当前使用的方式替换 URLSearchP
如何正确安装 PUG/JADE 到 Angular 2 或更高版本 这样在工作和 AOT 和 JiT 的同时 工作单元和集成测试 并且在创建每个新组件时不会受到太多影响 最佳答案 我看到了很多解决方案
我的 Angular 12 应用程序中有一些通用组件,我计划将其创建为一个 Angular 库,以便其他应用程序也可以使用它。我们有一些应用程序在较低版本的 angular(例如 angular 8/
tl;dr; ng build 删除了包含我编译的自定义库的/dist 文件夹。这会使我项目代码中对该库的所有引用无效,从而导致 ng build 最终失败。我做错了什么? 我关注了documenta
我正在将一些“遗留”(非 typescript )js 库导入到我的 Angular SPA 中。 通常我只是从 cdn 添加一个负载到 index.html 就像: 在 Angular 分量中我只
我有这个 angular 应用程序,它基本上使用了库的概念。 我有 2 个名为 的库Lib1 和 lib2 根据他们所服务的微服务分组。 现在我将这些库导入主应用程序,即 应用1 事情一直到现在。 现
我在我的项目中启用了 angular Universal。我现在想完全删除它。我试图删除以下文件 /server.ts /webpack.server.config.js /src/tsconfig.
我已经有一个 AuthService 在登录时对用户进行身份验证,并且 AuthGuard 在未登录的情况下阻止访问。 某些页面我通过 UserProfile/Role 限制访问,但现在我需要阻止页面
我正在尝试使用 angular、TypeORM、SQLite 和其他组件作为 webpack 构建 Electron 应用程序。 我从在 GitHub 上找到的示例开始我的开发:https://git
我在从 Angular 8 更新到 9 并运行时遇到以下错误 ng 更新@angular/material: Package "@angular/flex-layout" has an incompa
我正在尝试使用 Angular 9,我想创建一个项目,然后创建一个库项目并开始向其中添加我想稍后在 GitHub 上发布的通用模块,并在我的本地使用这些库项目。 相关依赖如下: Angular CLI
我正在尝试使用 Angular 9,我想创建一个项目,然后创建一个库项目并开始向其中添加我想稍后在 GitHub 上发布的通用模块,并在我的本地使用这些库项目。 相关依赖如下: Angular CLI
我正在我的 h1 元素“之前”创建一个小的程式化三 Angular 形图案,但我无法正确地圆 Angular 。右上角没问题,但其他两个有剪裁问题。 这是输出以及形状的放大图像: 使用的代码如下: h
我有一个 Angular 元素,带有自定义标记名 - fancy-button。如何将 fancy-button 嵌入 Angular 应用程序? 我已经尝试了以下方法,但都没有用 - 在 index
我已将我的项目从 angular 5.2.9 升级到 angular 6.0.0-rc.5。 除了包路径中的几个快速 RxJS 修复外,一切看起来都不错。(此链接非常有用:Want to upgrad
我是一名优秀的程序员,十分优秀!