- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以我试图过滤一个列表,我正在重复使用一个开关来过滤禁用的列表。关闭切换到常规列表。我使用有 Angular Material 作为设计。 ing-modeled showAll 来绑定(bind)加载所有列表。我使用 asset.disabled 在重复中放置禁用的内容。所以我尝试使用 ctrl.infiniteAssets.disabled。行不通。
import angular from 'angular'
import assetClassificationTemp from './create-asset/partials/asset-classification-dialog.html';
import assetClassificationController from './create-asset/partials/classifications.controller.js';
import createAssetTemp from './create-asset/create-asset.html';
import createAssetController from './create-asset/create-asset.controller.js';
class AssetsController{
constructor(siAsset, $mdDialog, $state, siAlertDialog,$timeout, $rootScope, $log, $q, helpDialog,$mdMedia, siTenant,toastIt,$filter, $scope){
"ngInject";
this.siAsset = siAsset;
this.$mdDialog = $mdDialog;
this.$state = $state;
this.siAlertDialog = siAlertDialog;
this.$timeout = $timeout;
this.$rootScope = $rootScope;
this.$log = $log;
this.$q = $q;
this.helpDialog = helpDialog;
this.$mdMedia = $mdMedia;
this.siTenant = siTenant;
this.$filter = $filter;
this.$scope = $scope;
this.toastIt = toastIt;
}
$onInit = () => {
this.swtich = false;
this.hideToolbarTools = false;
this.searchOpen = false;
this.componentList = [];
this.alertCount = 0;
this.loading = false;
this.disableTitle = false;
this.searchValue = "";
this.first = true;
this.settings = {
printLayout: true,
showRuler: true,
showSpellingSuggestions: true,
presentationMode: 'edit'
};
this.global = this.$rootScope;
this.$rootScope.$on('transform-toolbar-open', () => {
//hide toolbar controls on mobile
if(this.$mdMedia('xs')){
this.hideToolbarTools = true;
}else{
this.hideToolbarTools = false
}
})
this.$rootScope.$on('transform-toolbar-close', () => {
//show toolbar controls
this.hideToolbarTools = false;
})
this.loadAssets()
}
loadAssets = () => {
var self = this;
self.infiniteAssets = {
numLoaded_: 0,
toLoad_: 0,
items: [],
pageNum:1,
virtualIndex:0,
getItemAtIndex: function (index) {
this.virtualIndex=index;
if (index > this.numLoaded_) {
this.fetchMoreItems_(index);
return null;
}
return this.items[index];
},
// Required.
getLength: function () {
if (this.virtualIndex > this.numLoaded_) {
return this.numLoaded_ ;
}else{
return this.numLoaded_ + 5 ;
}
},
fetchMoreItems_ : function (index) {
if (this.toLoad_ < index) {
self.loading = true;
this.toLoad_ += 20;
self.siAsset.getAssets(this.pageNum++,20)
.then(angular.bind(this, function (assets) {
//this.objLength = assets.length;
if(! assets.statusCode){
this.items = this.items.concat(assets);
this.toLoad_ = this.items.length;
this.numLoaded_ = this.toLoad_;
}
self.loading = false;
}))
}
}
};
}
refresh = () => {
this.$state.reload();
}
sampleAction = (name, ev) => {
this.$mdDialog.show(this.$mdDialog.alert()
.title(name)
.content('You triggered the "' + name + '" action')
.ok('Great')
.targetEvent(ev)
);
};
loadDetail = (asset) => {
this.$state.go('administration.assetdetail', {
componentId: asset.id
});
}
remoteSearch = (searchText) => {
var deferred = this.$q.defer();
this.siAsset.searchComponents(searchText, true)
.then((data) =>{
delete data.success;
deferred.resolve(data);
}, (err) => {
deferred.reject(err);
});
return deferred.promise
}
createAsset = (ev) => {
this.getClassificationList(ev);
};
deleteAsset = (asset) =>{
let message = this.$filter('translate')('SI-MESSAGES.DEL-AST-MSG') + asset.name+'?';
let title = this.$filter('translate')('SUBHEADER.DEL-AST');
let button = this.$filter('translate')('BUTTON.DELETE');
this.siAlertDialog.confirm(message,title,button)
.then(() => {
this.siAsset.deleteAsset(asset.id).then((data) =>{
this.toastIt.simple(this.$filter('translate')('SI-MESSAGES.ASSET-DEL-TOST'))
this.refresh()
},(err) => {
this.siAlertDialog.warning(this.$filter('translate')('SI-MESSAGES.AST-CANT-DEL'));
})
})
};
showCreateAssetDialog = (ev) =>{
this.$mdDialog.show({
template:createAssetTemp,
controller: createAssetController,
controllerAs:'ctrl',
event:ev,
fullscreen: true,
locals:{
classificationList : this.classificationList,
hasChilds: this.hasChilds,
selectedClassification : this.classification
}
})
.then((resp) =>{
if(resp !== 'closed'){
this.loadAssets();
}
}, () => {
console.log("Error")
});
};
//Get classifications past locations level (classifications of assets
//i.e Parent Asset, Child Asset
getLevel = () =>{
var deferred = this.$q.defer();
this.siTenant.getId().then((tenantID) =>{
this.siTenant.getById(tenantID)
.then((_tenant) =>{
deferred.resolve(_tenant.locationsLevels);
},(err) =>{
deferred.reject(err);
})
},(err) =>{
deferred.reject(err);
})
return deferred.promise
};
showAssetTypesDialog = (ev) =>{
this.$mdDialog.show({
template:assetClassificationTemp,
controller: assetClassificationController,
controllerAs:'ctrl',
fullscreen: true,
locals:{
classificationList : this.classificationList
}
})
.then((data) => {
if(data !== 'closed'){
this.classification = data;
this.showCreateAssetDialog(ev);
}
},(err) => {
console.log(err);
console.log("Types Dialog Error!")
});
};
getClassificationList = (ev) =>{
this.getLevel().then((_locationLevel) => {
this.siAsset.getClassifications()
.then((data) => {
this.classificationList = [];
data.map((c) => {
if (c.level > _locationLevel) {
this.classificationList.push(c);
}
});
if(this.classificationList.length > 1){
this.hasChilds = true;
this.showAssetTypesDialog(ev);
}else{
this.hasChilds = false;
this.showCreateAssetDialog(ev);
}
},(err) => {
this.siAlertDialog.error(err.message || 'Error fetching tenant location levels') ;
});
});
};
displayHelp = (ev) => {
this.helpDialog.display(ev, this.$filter('translate')('ASSETS-TIPS.ASSET-TITLE'), this.$filter('translate')('ASSETS-TIPS.ASSETS-TIP-DESC'));
}
}
export default AssetsController;
<md-toolbar class="md-primary">
<md-progress-linear ng-show="$ctrl.loading || $ctrl.global.stateIsLoading" class="md-accent" md-mode="indeterminate"></md-progress-linear>
<div class="md-toolbar-tools" layout-align="space-between center">
<md-button ng-hide="$ctrl.hideToolbarTools" class="md-icon-button cssFade" aria-label="Toggle Menu" ng-click="$ctrl.global.toggle()" hide-gt-lg>
<md-icon md-svg-icon="menu"></md-icon>
</md-button>
<span ng-hide="$ctrl.hideToolbarTools" class='cssFade'>
<md-button aria-label="Go Back" ng-if="$ctrl.global.breadcrumbs" class="md-icon-button" ng-click="$ctrl.$rootScope.goBack()">
<md-icon md-svg-icon="arrow-back"></md-icon>
</md-button>
<h1>{{$ctrl.global.topic}}</h1>
<h1>{{$ctrl.global.subTopic | uppercase}}</h1>
</span>
<span flex ></span>
<expand-search
search="$ctrl.searchValue"
remote-search="$ctrl.remoteSearch"
on-selection="$ctrl.loadDetail"></expand-search>
<si-tenant-toggle ng-hide='$ctrl.hideToolbarTools' is-dark='false'></si-tenant-toggle>
<md-button aria-label="Help Button" ng-hide='$ctrl.hideToolbarTools' class='md-icon-button cssFade' ng-click='$ctrl.displayHelp($event)'>
<md-icon md-svg-icon='help'></md-icon>
</md-button>
</div>
</md-toolbar>
<div layout="row" layout-align="center end" class="resolvedSwitch">
<md-switch ng-model='$ctrl.switch' ng-change="">
{{'LABELS.SHOW-DISABLED' | translate}}
</md-switch>
</div>
<div>
<md-content layout="column" class="full-height-content" layout-fill md-default-theme>
<div layout="column" flex>
<md-content class="full-height-content " >
<div ng-if="$ctrl.infiniteAssets.getLength() <= 0 && !$ctrl.loading " layout layout-align="center center" layout-padding>
<div class="notice " style=" text-align:center">
<p>
You have not defined any assets. To create a new asset, click the button on the bottom right of your screen
or <a class=" md-accent" ng-click="$ctrl.createAsset($event)"><span class="cursorPointer">click here</span></a>.
</p>
</div>
</div>
<md-virtual-repeat-container id="vertical-container" ng-show="$ctrl.infiniteAssets.getLength() > 0 && !$ctrl.switch">
<md-list>
<md-list-item class="list-page" md-on-demand md-virtual-repeat='asset in $ctrl.infiniteAssets | assetsFilter:$ctrl.searchValue' ng-click="$ctrl.loadDetail(asset)">
<span class="search-status" style="border-left-color:{{asset.statusColor}};"></span>
<p>{{asset.name}} </p>
<label hide-xs ng-if="asset.disabled" class="ng-animate-disabled">
<md-chips>
<md-chip>{{'LABELS.DISABLED' | translate}}</md-chip>
</md-chips>
</label>
<label><i>{{asset.status || 'UNKNOWN'}}</i></label>
<md-button aria-label="Delete Asset" class="md-icon-button md-warn" layout-padding ng-click="$ctrl.deleteAsset(asset)">
<md-icon md-svg-icon="delete" class="modelTrashIcon"></md-icon>
</md-button>
<md-divider></md-divider>
</md-list-item>
</md-list>
</md-virtual-repeat-container>
<md-virtual-repeat-container id="vertical-container" ng-show="$ctrl.infiniteAssets.getLength() > 0 && $ctrl.switch">
<md-list>
<md-list-item class="list-page" md-on-demand md-virtual-repeat='asset in $ctrl.infiniteAssets | assetsFilter:$ctrl.searchValue' ng-click="$ctrl.loadDetail(asset)">
<span class="search-status" style="border-left-color:{{asset.statusColor}};"></span>
<p ng-if="asset.disabled">{{asset.name}} </p>
<label hide-xs ng-if="asset.disabled" class="ng-animate-disabled">
<md-chips>
<md-chip ng-if="asset.disabled">{{'LABELS.DISABLED' | translate}}</md-chip>
</md-chips>
</label>
<label ng-if="asset.disabled"><i>{{asset.status || 'UNKNOWN'}}</i></label>
<md-button ng-if="asset.disabled" aria-label="Delete Asset" class="md-icon-button md-warn" layout-padding ng-click="$ctrl.deleteAsset(asset)">
<md-icon md-svg-icon="delete" class="modelTrashIcon"></md-icon>
</md-button>
<md-divider></md-divider>
</md-list-item>
</md-list>
</md-virtual-repeat-container>
</md-content>
</div>
</md-content>
</div>
<md-button aria-label="Create New Asset" class="md-fab md-fab-bottom-right" ng-click="$ctrl.createAsset()">
<md-icon md-svg-icon="add"></md-icon>
</md-button>
<si-tenant-toggle-menu></si-tenant-toggle-menu>
最佳答案
您只需使用 ng-switch
模型,并将每个项目的状态作为 ng-if
中的条件。您可以直接在md-content
中使用md-list
和md-list-item
。无需使用md-virtual-repeat-container
,因为md-content
将在需要时添加滚动条。
这是 JavaScript。
angular.module('myApp',['ngMaterial'])
.controller('TempController',function($scope){
$scope.tempSwitch = true;
$scope.data= [
{name: "Asset 1", status: true},
{name: "Asset 2", status: true},
{name: "Asset 3", status: true},
{name: "Asset 4", status: true},
{name: "Asset 5", status: true},
{name: "Asset 6", status: true},
];
$scope.delete = function(item){
item.status = !item.status;
}
$scope.itemClick= function(item){
console.log(item);
}
});
HTML 代码。
<body layout="column" layout-fill ng-app="myApp" ng-cloak ng-controller="TempController">
<div layout="row" layout-align="center end" class="resolvedSwitch">
<md-switch ng-model='tempSwitch'>
SHOW-DISABLED
</md-switch>
</div>
<md-content layout="column" flex style='background-color:#d1d1d1'>
<md-list>
<md-list-item ng-click="itemClick(item)" ng-repeat="item in data" layout-align="start center" ng-show="item.status || tempSwitch">
<span>{{item.name}} </span>
<span flex></span>
<span>{{item.status}}</span>
<md-button aria-label="Delete Asset" class="md-icon-button md-warn" ng-click="delete(item)">
<md-icon>D</md-icon>
</md-button>
<md-divider></md-divider>
</md-list-item>
</md-list>
</md-content>
</body>
这是工作 Codepen示例。
关于javascript - 带开关的 Angular 过滤器列表( Angular Material )?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44664215/
我有一个对象数组,我想在键传入“filter”过滤器时提取值。下面是我尝试过的 Controller 代码片段,但我得到的响应类型未定义。请帮我找出哪里出错了。 var states = [{"HI
如果任何 J2EE 应用程序直接访问 servlet,然后 servlet 将相同的请求转发到某个 .jsp 页面。 request.getRequestDispatcher("Login.jsp")
我有一个带有图像缩略图的表单,可以通过复选框进行选择以进行下载。我想要一个包含 jQuery 中图像的数组,用于 Ajax 调用。 2个问题: - 表格顶部有一个复选框,用于切换我想要从映射中排除的所
我必须从服务器转储数据库,将 .sql 传输到另一台服务器,然后运行以下脚本以使用此语法删除某些行: DELETE wp_posts FROM wp_posts INNER JOIN wp_postm
我想从目录中过滤掉特定类型的文件,但收到错误“ token 语法错误,删除这些 token ”: File dir = new File("c:/etc/etc"); File[] f
几乎所有的 Web 应用程序都依赖外部的输入。这些数据通常来自用户或其他应用程序(比如 web 服务)。通过使用过滤器,您能够确保应用程序获得正确的输入类型。 您应该始终对外部数据进行过滤! 输
我正在开发一个由 OData 服务提供支持的搜索功能。它将返回一个或一列标题对象作为结果。我们需要搜索的许多字段不在标题对象中。它们仅在子对象(导航属性)中。能够针对子字段执行 OData 搜索并仍然
假设我有以下模型,它有一个方法 variants(): class Example(models.Model): text = models.CharField(max_length=255)
我有一个默认的列表列表,但我基本上想这样做: myDefaultDict = filter(lambda k: len(k)>1, myDefaultDict) 除了它似乎只适用于列表。我能做什么?
我正在使用 django-filter 来输出我的模型的过滤结果。那里没有问题。下一步是添加一个分页器……尽管现在已经苦苦挣扎了好几天。 views.py: def funds_overview(re
我正在做一个概念证明,我正在试验一种奇怪的行为。 我有一个按日期字段按范围分区的表,如果我设置固定日期或由 SYSDATE 创建的日期,查询的成本会发生很大变化。 这些是解释计划: SQL> SELE
如果一个或另一个值匹配,是否可以制作一个过滤器,例如一个中性的 PropertyFilter(并传递给链中的下一个过滤器)?就像是: value1 val
我是 VBA 初学者,正在尝试根据单元格值过滤数据,经过一番谷歌搜索后,我编写了一个有效的代码 Sub FilterDepartment_Sales() Sheet6.Activate
假设我在 excel 数据透视表中有两个过滤器。 两者最初都会显示筛选列的选定范围内的所有值。 当我仅在过滤器 1 中选择几个值时,过滤器 2 仍会继续显示基础数据中所选范围内特定过滤器列中的所有值。
是否可以定义自定义 build-ins (名称不再适合)在 ftl? 由于语义前提,我不想让它成为一个函数,而是一个内置的。 最佳答案 这是不可能的,?语法是为内置函数保留的。 (顺便说一句,这意味着
我试图在 Edit | 之外添加一个链接通过插件删除wordpress管理员>用户>所有用户列表中的链接..这是我第一次尝试通过查看其他插件或搜索google来制作wordpress插件.. 我添加了
我正在尝试按照以下教程使用 django 过滤器进行分页,但该教程似乎缺少某些内容,而且我无法使用基于函数的 View 方法显示分页。 https://simpleisbetterthancomple
由于我是 Powershell 新手,因此寻求最佳实践方面的帮助, 我有一个 csv 文件,我想过滤掉 csv 中的每一行,除了包含“未安装”的行 然后,我想根据包含计算机列表的单独 csv 文件过滤
我正在尝试创建一个搜索查询,它会告诉我我作为审阅者添加到其中的打开更改,但我还没有提交最新补丁集的代码审查。这应该包括其他人已经评论过的更改,但我没有。 我能找到的最接近的是 is:reviewer
在我的 Web 应用程序中,我有 3 个主要部分 1. 客户 2. 供应商 3. 管理员 我正在使用 java session 过滤器来检查用户 session 并允许访问网站的特定部分。 因此客户只
我是一名优秀的程序员,十分优秀!