1
我在模型中有一個屬性'orderNumber'的化身的集合。我需要我的頭像集合以'orderNumber'字段進行排序。每個對象都有它的orderNumber,如果你改變了robomongo中Object的orderNumber,例如,由於它的'orderNumber'編號,對象交換。按屬性排序對象AngularJS
這裏是我的模型:
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var CollectionSchema = new Schema({
name: {
type: String,
required: 'Name is required!'
},
description: {
type: String
},
orderNumber:{
type: Number
},
defaultAvatar: [{
type: Schema.Types.ObjectId,
ref: 'Part'
}],
designer_id: {
type: Schema.Types.ObjectId,
ref: 'Designer'
},
pipeline: [{
name: {
type: String,
required: 'Pipeline step name is required!'
},
zoom: Boolean,
templates: [{
name: {
type: String,
required: 'Template name is required!'
},
parts: [{
type: Schema.Types.ObjectId,
ref: 'Part'
}]
}]
}]
});
module.exports = mongoose.model('Collection', CollectionSchema);>
這裏是我的控制器
(function() {
'use strict';
angular
.module('mainApp')
.controller('simpleACController', simpleACController);
function simpleACController($scope, $location, $compile, $localStorage, CanvasRendererFactory, WrapUnwrapFactory,
PremadeAvatarManager, PartsFactory, AvatarConstructorFactory, UserAvatarsFactory,
JqueryRenderFactory, UserFactory) {
var vm = this; // ViewModel, you are free of controller's name in html
var canvas = new fabric.StaticCanvas('');
vm.showPreviousButton = false;
vm.showNextButton = true;
var savedAvatarMiniatures = [];
var savedPipelineNumber;
// var canvas = new fabric.StaticCanvas('simpleAvatarCanvas');
var pipelineNumber; // -1
var previousPipeline;
var selectedType;
var selectedIndex = 0;
var previousIndex = 0;
var miniatureCarousel;
var avatarCarousel;
var transitionInProgress = false;
vm.avatars = [];
var initialAvatars = [];
var pipelineNames = {};
var pipelineZooms;
vm.select = function (index) {
savedAvatarMiniatures = vm.avatars;
selectedIndex = index;
if (pipelineNumber == -1) {
selectedType = index;
}
var wasSelected = vm.avatars[index].selected;
for (var i = 0; i < vm.avatars.length; i++) {
vm.avatars[i].selected = false;
}
vm.avatars[index].selected = !wasSelected;
if (pipelineNumber == -1) {
vm.avatarName = vm.avatars[index].name;
}
vm.showPreviousButton = (index != 0);
vm.showNextButton = (index != (vm.avatars.length - 1));
};
vm.selectNext = function() {
previousIndex = selectedIndex;
if (selectedIndex < vm.avatars.length - 1) {
changeMiniatureCarousel(++selectedIndex);
}
};
vm.selectPrevious = function() {
previousIndex = selectedIndex;
if (selectedIndex > 0) {
changeMiniatureCarousel(--selectedIndex);
}
};
vm.onMiniatureClick = function (index) {
if (!transitionInProgress) {
vm.select(index);
}
};
vm.prevPipeLine = function() {
var avatar = getSelectedAvatar();
if (avatar != null) {
if (pipelineNumber < getPipelineCount(avatar)) {
previousPipeline = pipelineNumber;
pipelineNumber--;
updatePipeline();
} else {
pipelineNumber--;
}
vm.switchCarousel(true);
}
updateText();
};
vm.nextPipeLine = function() {
if (getSelectedAvatar() != null) {
previousPipeline = pipelineNumber;
pipelineNumber++;
updatePipeline();
}
updateText();
};
vm.showCarousel = true;
vm.switchCarousel = function (flag) {
vm.showCarousel = flag;
};
vm.saveAvatar = function() {
if (!UserFactory.IsLoggedIn()) {
$localStorage.anonymousAvatar = getSelectedAvatar();
UserFactory.showLoginModal(function() {
save();
}, function (err) {
console.log('saveAvatar Error');
console.log(err);
});
} else {
save();
}
function save() {
var avatar = getSelectedAvatar();
var partIds = WrapUnwrapFactory.unwrapPartIds(avatar);
UserAvatarsFactory.saveAvatar(avatar.orderNumber, vm.avatarName, partIds, function() {
$location.path('/avatarmanager');
$scope.$apply();
});
}
};
vm.toFullAC = function() {
if (!UserFactory.IsLoggedIn()) {
UserFactory.showLoginModal(function() {
toFullAC(getSelectedAvatar());
}, function (err) {
console.log('toFullAC Error');
console.log(err);
});
} else {
toFullAC(getSelectedAvatar());
}
};
function changeMiniatureCarousel(index) {
refresh(index);
miniatureCarousel.trigger('to.owl.carousel', [index]);
}
function selectMiniatureCarousel() {
var index = (pipelineNumber == -1 && selectedType != undefined) ? selectedType : 0;
changeMiniatureCarousel(index)
}
function getSelectedAvatar() {
var avatar = null;
if (vm.avatars.length > 0) {
for (var i = 0; i < vm.avatars.length; i++) {
if (vm.avatars[i].selected == true) {
avatar = vm.avatars[i];
}
}
}
return avatar;
}
function updatePipeline() {
var avatar = getSelectedAvatar();
if (avatar) {
if (pipelineNumber < getPipelineCount(avatar)) {
updateMiniatures(avatar).then(function() {
return true;
});
} else {
if (!UserFactory.IsLoggedIn()) {
updateViewModel();
vm.switchCarousel(false);
} else {
toFullAC(avatar);
}
}
}
return false;
}
function updateText() {
var avatar = getSelectedAvatar();
if (pipelineNames.length != 0) {
var names = ['type'];
for (var i = 1; i < pipelineNames[avatar.orderNumber].length; i++) {
names.push(pipelineNames[avatar.orderNumber][i]);
}
if (pipelineNumber > -2) {
vm.heading = 'Select avatar ' + names[pipelineNumber + 1];
}
if (pipelineNumber >= getPipelineCount(avatar)) {
vm.heading = "Your avatar is ready! Save?"
}
}
}
function getPipelineCount(avatar) {
return PremadeAvatarManager.getPipelineCount(avatar);
}
function updateCarousels() {
renderAvatars();
renderMiniatures();
bindCarousels();
}
function renderMiniatures() {
var slideCount = 6;
slideCount = (vm.avatars.length < slideCount) ? vm.avatars.length : slideCount;
var settings = {
array: vm.avatars,
imageProperty: 'premade',
type: 'canvas',
width: 150,
height: 100,
vmArray: 'simpleAC.avatars',
oldCarousel: '#simpleACcarousel',
carouselRoot: '#miniatures-carousel-root',
containerClass: "as-slider",
containerID: "simpleACcarousel",
divClick: ' ng-click="simpleAC.onMiniatureClick',
slideCount: slideCount,
centerMode: false,
needsText: true,
selectable: true
};
var divNroot = JqueryRenderFactory.render(settings, $scope, $compile);
miniatureCarousel = divNroot.div;
//divNroot.root.append(miniatureCarousel);
$compile(divNroot.root)($scope);
CanvasRendererFactory.renderAvatarsToCanvasesInCarousel(vm.avatars, miniatureCarousel);
miniatureCarousel.owlCarousel({
responsive: {
0: {
items: 5,
},
1439: {
items: 7,
}
},
animateIn: 'fadeIn',
animateOut: 'fadeOut',
center: true,
loop: false,
margin: 10,
mouseDrag: false,
touchDrag: false,
nav: false
});
}
function renderAvatars() {
var slideCount = 3;
slideCount = (vm.avatars.length - 1 < slideCount) ? 1 : slideCount;
var settings = {
array: vm.avatars,
imageProperty: 'premade',
type: 'canvas',
width: 480,
height: 320,
vmArray: 'simpleAC.avatars',
oldCarousel: '#simpleACavatarCarousel',
carouselRoot: '#avatars-carousel-root',
containerClass: "ag-slider",
containerID: "simpleACavatarCarousel",
divClick: ' ',
slideCount: slideCount,
centerMode: true,
needsText: false,
selectable: false
};
var divNroot = JqueryRenderFactory.render(settings, $scope, $compile);
avatarCarousel = divNroot.div;
//divNroot.root.append(avatarCarousel);
$compile(divNroot.root)($scope);
CanvasRendererFactory.renderAvatarsToCanvasesInCarousel(vm.avatars, avatarCarousel);
avatarCarousel.owlCarousel({
animateIn: 'fadeIn',
animateOut: 'fadeOut',
items: 5,
center: true,
loop: false,
margin: 10,
mouseDrag: false,
touchDrag: false,
nav: false
});
var items = $('.owl-item');
items.removeClass('medium');
items.eq(1).addClass('medium');
avatarCarousel.on('translate.owl.carousel', function (e) {
var index = e.item.index;
var items = $('.owl-item');
items.removeClass('medium');
items.eq(index - 1).addClass('medium');
items.eq(index + 1).addClass('medium');
});
}
function renderCanvasesInCarousel(carousel) {
var canvasArray = carousel.find("canvas");
for (var i = 0; i < vm.avatars.length; i++) {
var canvas = new fabric.StaticCanvas(canvasArray[i]);
canvasArray[i].removeAttribute('style');
WrapUnwrapFactory.unwrapAvatar(vm.avatars[i], {x: canvas.width, y: canvas.height},
function (canvas) {
return function (array) {
CanvasRendererFactory.drawAvatar(canvas, array);
}
}(canvas)
);
}
}
function bindCarousels() {
var changing = false;
var changed;
var duration = 300;
avatarCarousel.on('changed.owl.carousel', function (e) {
if (!changing) {
changing = true;
miniatureCarousel.trigger('to.owl.carousel', [e.item.index, 0]);
changing = false;
}
});
miniatureCarousel.on('click', '.owl-item', function() {
if (!transitionInProgress) {
var index = $(this).index();
avatarCarousel.trigger('to.owl.carousel', [index, 0]);
}
});
miniatureCarousel.on('translate.owl.carousel', function (e) {
transitionInProgress = true;
});
miniatureCarousel.on('translated.owl.carousel', function (e) {
transitionInProgress = false;
});
miniatureCarousel.on('changed.owl.carousel', function (e) {
if (!changing) {
changing = true;
avatarCarousel.trigger('to.owl.carousel', [e.item.index, 0]);
refresh(e.item.index);
if (!$scope.$$phase) {
$scope.$apply();
}
changing = false;
}
});
}
function initpipelineNames() {
vm.avatars.forEach(function(avatar) {
var resultArray = [];
PremadeAvatarManager.getPipeline(avatar).forEach(function(pipeline) {
resultArray.push(pipeline.name);
});
pipelineNames[avatar.orderNumber] = resultArray;
});
AvatarConstructorFactory.SimpleACpipelineNames(pipelineNames);
}
function updateViewModel() {
vm.backButtonHidden = (pipelineNumber == -1);
}
function updateMiniatures(avatar) {
return new Promise(function (resolve) {
PremadeAvatarManager.getAvatarArray(avatar, pipelineNumber).then(function (collection) {
vm.avatars = collection;
console.log(avatars);
if (pipelineNumber == -1) {
initialAvatars = collection;
}
// var index = (pipelineNumber == -1 && selectedType != undefined) ? selectedType : 0;
updateViewModel();
updateAvatarConstructorFactory();
updateCarousels();
selectMiniatureCarousel();
switchZoom();
if (!$scope.$$phase) {
$scope.$apply();
}
resolve()
});
});
//return (vm.avatars != undefined);
}
function changeLocationAfterLoaded(avatar) {
AvatarConstructorFactory.SelectedAvatarToFullAC(avatar);
$location.path('/fullac');
if (!$scope.$$phase) {
$scope.$apply();
}
}
function toFullAC(avatar) {
var defaultTypes = PartsFactory.getDefaultPartTypes(avatar.orderNumber);
var avatarTypes = WrapUnwrapFactory.unwrapTypes(avatar);
var filtered = _.filter(defaultTypes, function (type) {
return avatarTypes.indexOf(type) >= 0; // contains
});
var typesStack = PartsFactory.getPartsByTypeArray(avatar.orderNumber, filtered);
AvatarConstructorFactory.TypesStack(typesStack);
changeLocationAfterLoaded(avatar);
}
function refresh(index) {
index = (index == undefined) ? 0 : index;
if (vm.avatars[index].selected) {
vm.select(index);
}
vm.select(index);
}
function updateAvatarConstructorFactory() {
AvatarConstructorFactory.SimpleACavatarMiniatures(vm.avatars);
AvatarConstructorFactory.SimpleACpipelineNumber(pipelineNumber);
}
function switchZoom() {
var items = $('.avatar-gallery .owl-item');
if (pipelineNumber > -1 && pipelineZooms == undefined) {
var avatar = getSelectedAvatar();
var collection = PartsFactory.findCollection(avatar.orderNumber);
pipelineZooms = [];
collection.pipeline.forEach(function (pipeline) {
if (pipeline.zoom) {
pipelineZooms.push(true);
} else {
pipelineZooms.push(false);
}
});
setZoom();
} else if (pipelineNumber > -1) {
setZoom();
}
function setZoom() {
if (pipelineZooms[pipelineNumber + 1]) {
items.addClass('zoom');
} else {
items.removeClass('zoom');
}
}
}
function activate() {
PartsFactory.registerCollectionObserverCallback(internalActivate);
if (PartsFactory.areCollectionsInitialized()) {
internalActivate();
}
function internalActivate() {
if (!AvatarConstructorFactory.isInit()) {
pipelineNumber = -1;
updateMiniatures().then(function() {
initpipelineNames();
updateText();
if (!$scope.$$phase) {
$scope.$apply();
}
vm.selectNext()
})
} else {
updateViewModel();
pipelineNumber = AvatarConstructorFactory.SimpleACpipelineNumber();
vm.avatars = AvatarConstructorFactory.SimpleACavatarMiniatures();
pipelineNames = AvatarConstructorFactory.SimpleACpipelineNames();
updateCarousels();
selectMiniatureCarousel();
switchZoom();
updateText();
refresh();
if (!$scope.$$phase) {
$scope.$apply();
}
vm.selectNext()
}
}
}
activate();
}
})();
和視圖
<div ng-controller="simpleACController as simpleAC" class="inner-bg clearfix">
<div class="inner avatar-generator">
<div class="character-bg">
<div class="layer-one"></div>
<div class="layer-two"></div>
</div>
<div class="container">
<div class="row">
<div class="col-md-12">
<div class="avatar-gallery">
<div class="controls">
<div class="add-name">
<form action="">
<input type="text"
class="cell"
ng-hide="simpleAC.showCarousel"
ng-model="simpleAC.avatarName">
</form>
</div>
</div>
<div class="ag-controls">
<i class="ag-prev" ng-show="simpleAC.showCarousel && simpleAC.showPreviousButton"
ng-click="simpleAC.selectPrevious()">prev</i>
<i class="ag-next" ng-show="simpleAC.showCarousel && simpleAC.showNextButton"
ng-click="simpleAC.selectNext()">next</i>
</div>
<div id="avatars-carousel-root"></div>
</div>
</div>
</div>
<div class="avatar-details">
<div class="container">
<div class="title">
<span class="back button"
ng-hide="simpleAC.backButtonHidden"
ng-click="simpleAC.prevPipeLine()">back</span>
<h2 ng-bind="simpleAC.heading">Select avatar type</h2>
<span class="next button"
ng-show="simpleAC.showCarousel"
ng-click="simpleAC.nextPipeLine()">next</span>
</div>
<div class="avatar-styles">
<div ng-show="simpleAC.showCarousel">
<div class="as-controls">
<i class="as-prev" ng-show="simpleAC.showPreviousButton"
ng-click="simpleAC.selectPrevious()">prev</i>
<i class="as-next" ng-show="simpleAC.showNextButton" ng-click="simpleAC.selectNext()">next</i>
</div>
<div id="miniatures-carousel-root">
</div>
</div>
<div ng-show="!simpleAC.showCarousel">
<div class="done-controls">
<a class="btn fakelink" ng-click="simpleAC.toFullAC()">Edit details</a>
<a class="btn button-blue fakelink" ng-click="simpleAC.saveAvatar()">Save</a>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>