<!DOCTYPE html>
<html>
<head>
<script src="//code.jquery.com/jquery-1.11.0.min.js"></script>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.1/css/bootstrap.min.css">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.1/css/bootstrap-theme.min.css">
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.1/js/bootstrap.min.js"></script>
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.3.2/angular.min.js"></script>
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.3.2/angular-route.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/linq.js/2.2.0.2/linq.js"></script>
<script src="jsdeffered.js"></script>
<script src="script.js"></script>
<link rel="stylesheet" href="style.css">
<style>
</style>
</head>
<body ng-app="MultipleModelsApp" class="container">
<div class="col-sm-6" ng-controller="NavCtrl">
<div class="col-sm-6 nav" ng-repeat="view in views">
<button type="button" class="btn btn-info" ng-click="setView(view.name)">{{view.name}}</button>
</div>
</div>
<div class="col-sm-12 content" ng-view="">
</div>
</body>
</html>
(function() {
var AngularApp = angular.module("MultipleModelsApp", ['ngRoute']);
AngularApp.factory('DataRequestPost', function($http, $q) {
return {
get: function(url, json) {
var mydeffered = $q.defer();
$http({
url: url,
method: "POST",
data: json
})
.success(mydeffered.resolve).error(mydeffered.reject);
return mydeffered.promise;
}
}
});
AngularApp.factory('DataRequestGet', function($http, $q) {
return {
get: function(url) {
var def = $q.defer();
$http.get(url).success(def.resolve).error(def.reject);
return def.promise;
}
}
});
// Not applicable for Plunker
AngularApp.factory('ViewService', function($http, $q, $rootScope) {
var views = [{
name: 'Funds',
Title: "Fund History",
url: '/vm/ExtractPortfolio',
queurl: '/vm/FundByID',
quenewurl: '/vn/NewFund',
updateurl: '/vm/SubmitFund'
}, {
name: 'Holders',
Title: "Account Holders",
url: '/vm/ExtractHolders',
queurl: '/vm/HolderById',
quenewurl: '/vm/NewHolder',
updateurl: '/vm/SubmitHolder'
}];
return {
getViews: function() {
return views;
},
getUrl: function(type) {
var query = (type == 'query') ? "$.queurl" : (type == 'new') ? "$.quenewurl" : (type == 'update') ? "$.updateurl" : "$.url";
var view = $rootScope.view;
var url = Enumerable.From(views)
.Where(function(x) {
return x.name == view
})
.Select(query)
.FirstOrDefault();
return url;
},
getTitle: function() {
var view = $rootScope.view;
var title = Enumerable.From(views)
.Where(function(x) {
return x.name == view
})
.Select(function(x) {
return x.Title
})
.FirstOrDefault();
return title;
}
}
});
AngularApp.config(['$routeProvider',
function($routeProvider) {
$routeProvider
.when('/', {
templateUrl: 'list.html',
controller: 'ListCtrl'
})
.when('/Modify/:id', {
templateUrl: 'update.html',
controller: 'ModifyCtrl'
})
.when('/New', {
templateUrl: 'new.html',
controller: 'NewCtrl'
});
}
]);
AngularApp.controller("NavCtrl", function($scope, $rootScope, ViewService) {
$scope.views = ViewService.getViews();
$rootScope.views = ViewService.getViews();
$scope.init = function() {
$rootScope.view = "Funds";
}
$scope.init();
$scope.setView = function(view) {
if (view !== $rootScope.view) {
$rootScope.view = view;
$rootScope.$emit("App.ViewChange");
}
}
});
AngularApp.controller("ModifyCtrl", function($scope, DataRequestPost, $routeParams, $window, $rootScope, ViewService, DatRequestSimulator) {
$scope.id = $routeParams.id;
$scope.Loading = false;
$scope.back = function() {
$window.history.back();
}
// Implemented for Plunker
var retrieve = function(){
console.log("retrieve");
DatRequestSimulator.getByID($scope.id).then(function(data){
$scope.Model = resolvemodel(data[0]);
$scope.Loading = false;
});
}
// Implemented for a Real Server Side Request (Not used in Plunker)
var retrieveModel = function() {
var url = ViewService.getUrl('query');
var params = {
id: $scope.id
};
DataRequestPost.get(url, params).then(function(data) {
var model = JSON.parse(data);
$scope.Model = resolvemodel(model);
});
}
var resolvemodel = function(model) {
var fields = model.fields;
var length = fields.length;
for (var i = 0; i < length; i++) {
if (model.fields[i].inputType === "date") {
var day = new Date(model.fields[i].FieldValue);
model.fields[i].FieldValue = new Date(day.getTime() + day.getTimezoneOffset() * 60000);
};
}
return model;
}
var UpdateModel = function(model) {
$scope.Loading = true;
var url = ViewService.getUrl('update')
var params = {
model: JSON.stringify(model)
};
DataRequest.get(url, params).then(function(data) {
$scope.Loading = false;
});
}
$scope.Update = function(model) {
alert("No Server Side Implementation")
//UpdateModel(model);
}
$scope.init = function() {
$scope.Loading = true;
retrieve();
//retrieveModel(); // for the actual server
}
$scope.init();
});
AngularApp.controller("NewCtrl", function($scope, DataRequestPost, $routeParams, $window, $rootScope, ViewService, DataRequestGet, DatRequestSimulator) {
// Implemented for Plunker
var retrieve = function(){
DatRequestSimulator.getNew().then(function(data){
console.log(data);
$scope.Model = data[0];
});
}
// Implemented for a Real Server Side Request
var retrieveModel = function() {
var url = ViewService.getUrl('new');
console.log(url);
DataRequestGet.get(url).then(function(data) {
var model = JSON.parse(data);
$scope.Model = model;
});
}
var updateModel = function(model) {
var url = ViewService.getUrl('update');
var params = JSON.stringify(model);
DataRequestPost.get(url, params).then(function(data) {
console.log(data);
});
}
$scope.back = function() {
$window.history.back();
}
$scope.Update = function(model) {
//updateModel();
alert("No Server Side Implementation")
}
$scope.init = function() {
retrieve();
//retrieveModel(); // for real server
}
$scope.init();
});
AngularApp.controller("ListCtrl", function($scope, $location, $rootScope, DataRequestGet, ViewService, DatRequestSimulator) {
$rootScope.$on("App.ViewChange", function() {
$location.path("/");
$scope.init();
});
var viewurl = "";
var geturl = function() {
var url = ViewService.getUrl('list');
return url;
}
var setTitle = function() {
$scope.Title = ViewService.getTitle();
}
// Impleted for Plunker
var retrieve = function() {
console.log("execute get simulator");
DatRequestSimulator.getDta().then(function(data) {
$scope.Model = data[0]; // [0] since it was push into an array
$scope.List = $scope.Model[0];
$scope.Loading = false;
})
}
// Implemented for Real Server Side Request
var retrievelist = function() {
DataRequestGet.get(viewurl).then(function(data) {
var serialize = JSON.parse(data);
$scope.Model = serialize;
$scope.List = serialize[0];
console.log(JSON.stringify(serialize));
});
}
$scope.GoTo = function(view, id) {
console.log(view);
console.log(id);
$location.path("/Modify/" + id);
}
$scope.NewModel = function() {
$location.path("/New");
}
$scope.Loading = false;
$scope.init = function() {
$scope.Loading = true;
setTitle();
retrieve();
//retrievelist();
}
$scope.init();
});
AngularApp.factory('DatRequestSimulator', function($q, $rootScope) {
var funds = [{
"MapId": "af1d7bd8-5378-4b62-89ea-220c2dd22764",
"fields": [{
"Label": "Money Market Fund",
"FieldName": "MoneyMarketFund",
"FieldValue": 27000,
"inputType": "number"
}, {
"Label": "Common Stocks",
"FieldName": "CommonStocks",
"FieldValue": 52000,
"inputType": "number"
}, {
"Label": "Stock Mutual Fund",
"FieldName": "StockMutualFund",
"FieldValue": 128000,
"inputType": "number"
}, {
"Label": "Bond Fund",
"FieldName": "BondFund",
"FieldValue": 53000,
"inputType": "number"
}, {
"Label": "As of",
"FieldName": "ValueDate",
"FieldValue": "2006-12-10T00:00:00",
"inputType": "date"
}]
}, {
"MapId": "a18c2f35-4a40-49be-b44c-31f04c63e443",
"fields": [{
"Label": "Money Market Fund",
"FieldName": "MoneyMarketFund",
"FieldValue": 26205,
"inputType": "number"
}, {
"Label": "Common Stocks",
"FieldName": "CommonStocks",
"FieldValue": 57044,
"inputType": "number"
}, {
"Label": "Stock Mutual Fund",
"FieldName": "StockMutualFund",
"FieldValue": 138496,
"inputType": "number"
}, {
"Label": "Bond Fund",
"FieldName": "BondFund",
"FieldValue": 54060,
"inputType": "number"
}, {
"Label": "As of",
"FieldName": "ValueDate",
"FieldValue": "2007-03-31T00:00:00",
"inputType": "date"
}]
}, {
"MapId": "1cbe9699-9ec9-43f6-86fe-2f9be0eaf6d1",
"fields": [{
"Label": "Money Market Fund",
"FieldName": "MoneyMarketFund",
"FieldValue": 25398,
"inputType": "number"
}, {
"Label": "Common Stocks",
"FieldName": "CommonStocks",
"FieldValue": 62235,
"inputType": "number"
}, {
"Label": "Stock Mutual Fund",
"FieldName": "StockMutualFund",
"FieldValue": 197498,
"inputType": "number"
}, {
"Label": "Bond Fund",
"FieldName": "BondFund",
"FieldValue": 55142,
"inputType": "number"
}, {
"Label": "As of",
"FieldName": "ValueDate",
"FieldValue": "2008-09-30T00:00:00",
"inputType": "date"
}]
}, {
"MapId": "bc0842d6-cf01-4587-9c40-01f56fffb122",
"fields": [{
"Label": "Money Market Fund",
"FieldName": "MoneyMarketFund",
"FieldValue": 24579,
"inputType": "number"
}, {
"Label": "Common Stocks",
"FieldName": "CommonStocks",
"FieldValue": 64911,
"inputType": "number"
}, {
"Label": "Stock Mutual Fund",
"FieldName": "StockMutualFund",
"FieldValue": 201843,
"inputType": "number"
}, {
"Label": "Bond Fund",
"FieldName": "BondFund",
"FieldValue": 56244,
"inputType": "number"
}, {
"Label": "As of",
"FieldName": "ValueDate",
"FieldValue": "2009-05-10T00:00:00",
"inputType": "date"
}]
}];
var holders = [{
"MapId": "16192b4a-ce4c-47ab-a008-9bd370a5ddd9",
"fields": [{
"Label": "Name",
"FieldName": "FirstName",
"FieldValue": "Charles",
"inputType": "text"
}, {
"Label": "LastName",
"FieldName": "LastName",
"FieldValue": "Smith",
"inputType": "text"
}, {
"Label": "Email",
"FieldName": "Email",
"FieldValue": "chalessmith@myemail.com",
"inputType": "text"
}, {
"Label": "Address",
"FieldName": "Address",
"FieldValue": "110 York ST",
"inputType": "text"
}, {
"Label": "ZipCode",
"FieldName": "ZipCode",
"FieldValue": 68106,
"inputType": "number"
}, {
"Label": "Age",
"FieldName": "Age",
"FieldValue": 25,
"inputType": "number"
}]
}, {
"MapId": "3a2a97ee-3dfc-4b07-9d2f-b285726780e4",
"fields": [{
"Label": "Name",
"FieldName": "FirstName",
"FieldValue": "Luis",
"inputType": "text"
}, {
"Label": "LastName",
"FieldName": "LastName",
"FieldValue": "Ortiz",
"inputType": "text"
}, {
"Label": "Email",
"FieldName": "Email",
"FieldValue": "luisortiz@myemail.com",
"inputType": "text"
}, {
"Label": "Address",
"FieldName": "Address",
"FieldValue": "220 North",
"inputType": "text"
}, {
"Label": "ZipCode",
"FieldName": "ZipCode",
"FieldValue": 68144,
"inputType": "number"
}, {
"Label": "Age",
"FieldName": "Age",
"FieldValue": 32,
"inputType": "number"
}]
}, {
"MapId": "6e32d5a6-b253-4205-903d-62f98c1ae359",
"fields": [{
"Label": "Name",
"FieldName": "FirstName",
"FieldValue": "Frank",
"inputType": "text"
}, {
"Label": "LastName",
"FieldName": "LastName",
"FieldValue": "Olsen",
"inputType": "text"
}, {
"Label": "Email",
"FieldName": "Email",
"FieldValue": "frankolsen@myemail.com",
"inputType": "text"
}, {
"Label": "Address",
"FieldName": "Address",
"FieldValue": "112 South",
"inputType": "text"
}, {
"Label": "ZipCode",
"FieldName": "ZipCode",
"FieldValue": 65132,
"inputType": "number"
}, {
"Label": "Age",
"FieldName": "Age",
"FieldValue": 41,
"inputType": "number"
}]
}];
var newFund = {"MapId":"51da78ff-7a60-4daa-946f-f64c90211c70","fields":[{"Label":"Money Market Fund","FieldName":"MoneyMarketFund","FieldValue":0,"inputType":"number"},{"Label":"Common Stocks","FieldName":"CommonStocks","FieldValue":0,"inputType":"number"},{"Label":"Stock Mutual Fund","FieldName":"StockMutualFund","FieldValue":0,"inputType":"number"},{"Label":"Bond Fund","FieldName":"BondFund","FieldValue":0,"inputType":"number"},{"Label":"As of","FieldName":"ValueDate","FieldValue":"0001-01-01T00:00:00","inputType":"date"}]};
var newHolder = {"MapId":"560fa842-4de9-4366-b537-a19f4fa2902d","fields":[{"Label":"Name","FieldName":"FirstName","FieldValue":null,"inputType":"text"},{"Label":"LastName","FieldName":"LastName","FieldValue":null,"inputType":"text"},{"Label":"Email","FieldName":"Email","FieldValue":null,"inputType":"text"},{"Label":"Address","FieldName":"Address","FieldValue":null,"inputType":"text"},{"Label":"ZipCode","FieldName":"ZipCode","FieldValue":0,"inputType":"number"},{"Label":"Age","FieldName":"Age","FieldValue":0,"inputType":"number"}]};
var getData = function() {
var deferred = $q.defer();
var view = $rootScope.view;
Deferred.define();
var result = new Array;
next(function() {
var model = ('Funds' == view) ? funds : holders;
result.push(model);
return wait(2); // 2 Second to Simulate Server Request
})
.next(function() {
deferred.resolve(result);
});
return deferred.promise;
}
var getId = function(id){
var deferred = $q.defer();
var view = $rootScope.view;
//Deferred.define();
var resultByID = new Array;
next(function() {
var model = ('Funds' == view) ? funds : holders;
var singleModel = Enumerable.From(model)
.Where(function(x){ return x.MapId == id })
.Select(function(x){return x}).FirstOrDefault();
console.log("query below")
console.log(singleModel);
resultByID.push(singleModel);
return wait(1); // 1 Second to Simulate Server Request
})
.next(function() {
deferred.resolve(resultByID);
});
return deferred.promise;
}
var getnew = function(){
var deferred = $q.defer();
var view = $rootScope.view;
Deferred.define();
var result = new Array;
next(function() {
var model = ('Funds' == view) ? newFund : newHolder;
console.log(model);
result.push(model);
return wait(1); // 2 Second to Simulate Server Request
})
.next(function() {
deferred.resolve(result);
});
return deferred.promise;
}
return {
get: function(modeltype) {
var model = (modeltype == 'Funds') ? funds : holders;
return model;
},
getDta: getData,
getByID : function(id){ return getId(id); },
getNew : getnew
}
});
}).call(this);
/* Styles go here */
.container {
margin-top: 70px;
}
.content {
margin-top: 20px;
}
.nav {
margin-top:10px;
}
* AngularJS Model From .NET MVC Application using Reflection Example
* select a record from list of views
<div class="row" >
<div class="col-sm-12" >
<h2>{{ Title }}</h2>
<table class="table table-hover" ng-show="!Loading">
<thead >
<th ng-repeat="field in List.fields"> {{ field.Label }}</th>
</thead>
<tbody>
<tr ng-repeat="row in Model" ng-click="GoTo(ModelType, row.MapId)">
<td ng-repeat="item in row.fields" >
<span ng-show="item.inputType == 'date'">
{{ item.FieldValue | date: 'MM/dd/yyyy'}}
</span>
<span ng-show="item.inputType != 'date'">
{{ item.FieldValue }}
</span>
</td>
</tr>
</tbody>
</table>
</div>
<div class="col-sm-12">
<div class="progress" ng-show="Loading">
<div class="progress-bar progress-bar-striped active" role="progressbar" aria-valuenow="100" aria-valuemin="0" aria-valuemax="45" style="width: 100%">
<i>Loading {{ Title }}..</i>
</div>
</div>
</div>
<div class="row">
<button type="button" class="btn btn-success" ng-click="NewModel()" >+ New</button>
</div>
</div>
// JSDeferred 0.4.0 Copyright (c) 2007 cho45 ( www.lowreal.net )
// See http://github.com/cho45/jsdeferred
function Deferred () { return (this instanceof Deferred) ? this.init() : new Deferred() }
Deferred.ok = function (x) { return x };
Deferred.ng = function (x) { throw x };
Deferred.prototype = {
_id : 0xe38286e381ae,
init : function () {
this._next = null;
this.callback = {
ok: Deferred.ok,
ng: Deferred.ng
};
return this;
},
next : function (fun) { return this._post("ok", fun) },
error : function (fun) { return this._post("ng", fun) },
call : function (val) { return this._fire("ok", val) },
fail : function (err) { return this._fire("ng", err) },
cancel : function () {
(this.canceller || function () {})();
return this.init();
},
_post : function (okng, fun) {
this._next = new Deferred();
this._next.callback[okng] = fun;
return this._next;
},
_fire : function (okng, value) {
var next = "ok";
try {
value = this.callback[okng].call(this, value);
} catch (e) {
next = "ng";
value = e;
if (Deferred.onerror) Deferred.onerror(e);
}
if (Deferred.isDeferred(value)) {
value._next = this._next;
} else {
if (this._next) this._next._fire(next, value);
}
return this;
}
};
Deferred.isDeferred = function (obj) {
return !!(obj && obj._id === Deferred.prototype._id);
};
Deferred.next_default = function (fun) {
var d = new Deferred();
var id = setTimeout(function () { d.call() }, 0);
d.canceller = function () { clearTimeout(id) };
if (fun) d.callback.ok = fun;
return d;
};
Deferred.next_faster_way_readystatechange = ((typeof window === 'object') && (location.protocol == "http:") && !window.opera && /\bMSIE\b/.test(navigator.userAgent)) && function (fun) {
var d = new Deferred();
var t = new Date().getTime();
if (t - arguments.callee._prev_timeout_called < 150) {
var cancel = false;
var script = document.createElement("script");
script.type = "text/javascript";
script.src = "data:text/javascript,";
script.onreadystatechange = function () {
if (!cancel) {
d.canceller();
d.call();
}
};
d.canceller = function () {
if (!cancel) {
cancel = true;
script.onreadystatechange = null;
document.body.removeChild(script);
}
};
document.body.appendChild(script);
} else {
arguments.callee._prev_timeout_called = t;
var id = setTimeout(function () { d.call() }, 0);
d.canceller = function () { clearTimeout(id) };
}
if (fun) d.callback.ok = fun;
return d;
};
Deferred.next_faster_way_Image = ((typeof window === 'object') && (typeof(Image) != "undefined") && !window.opera && document.addEventListener) && function (fun) {
var d = new Deferred();
var img = new Image();
var handler = function () {
d.canceller();
d.call();
};
img.addEventListener("load", handler, false);
img.addEventListener("error", handler, false);
d.canceller = function () {
img.removeEventListener("load", handler, false);
img.removeEventListener("error", handler, false);
};
img.src = "data:image/png," + Math.random();
if (fun) d.callback.ok = fun;
return d;
};
Deferred.next_tick = (typeof process === 'object' && typeof process.nextTick === 'function') && function (fun) {
var d = new Deferred();
process.nextTick(function() { d.call() });
if (fun) d.callback.ok = fun;
return d;
};
Deferred.next =
Deferred.next_faster_way_readystatechange ||
Deferred.next_faster_way_Image ||
Deferred.next_tick ||
Deferred.next_default;
Deferred.chain = function () {
var chain = Deferred.next();
for (var i = 0, len = arguments.length; i < len; i++) (function (obj) {
switch (typeof obj) {
case "function":
var name = null;
try {
name = obj.toString().match(/^\s*function\s+([^\s()]+)/)[1];
} catch (e) { }
if (name != "error") {
chain = chain.next(obj);
} else {
chain = chain.error(obj);
}
break;
case "object":
chain = chain.next(function() { return Deferred.parallel(obj) });
break;
default:
throw "unknown type in process chains";
}
})(arguments[i]);
return chain;
};
Deferred.wait = function (n) {
var d = new Deferred(), t = new Date();
var id = setTimeout(function () {
d.call((new Date()).getTime() - t.getTime());
}, n * 1000);
d.canceller = function () { clearTimeout(id) };
return d;
};
Deferred.call = function (fun) {
var args = Array.prototype.slice.call(arguments, 1);
return Deferred.next(function () {
return fun.apply(this, args);
});
};
Deferred.parallel = function (dl) {
var isArray = false;
if (arguments.length > 1) {
dl = Array.prototype.slice.call(arguments);
isArray = true;
} else if (Array.isArray && Array.isArray(dl) || typeof dl.length == "number") {
isArray = true;
}
var ret = new Deferred(), values = {}, num = 0;
for (var i in dl) if (dl.hasOwnProperty(i)) (function (d, i) {
if (typeof d == "function") dl[i] = d = Deferred.next(d);
d.next(function (v) {
values[i] = v;
if (--num <= 0) {
if (isArray) {
values.length = dl.length;
values = Array.prototype.slice.call(values, 0);
}
ret.call(values);
}
}).error(function (e) {
ret.fail(e);
});
num++;
})(dl[i], i);
if (!num) Deferred.next(function () { ret.call() });
ret.canceller = function () {
for (var i in dl) if (dl.hasOwnProperty(i)) {
dl[i].cancel();
}
};
return ret;
};
Deferred.earlier = function (dl) {
var isArray = false;
if (arguments.length > 1) {
dl = Array.prototype.slice.call(arguments);
isArray = true;
} else if (Array.isArray && Array.isArray(dl) || typeof dl.length == "number") {
isArray = true;
}
var ret = new Deferred(), values = {}, num = 0;
for (var i in dl) if (dl.hasOwnProperty(i)) (function (d, i) {
d.next(function (v) {
values[i] = v;
if (isArray) {
values.length = dl.length;
values = Array.prototype.slice.call(values, 0);
}
ret.call(values);
ret.canceller();
}).error(function (e) {
ret.fail(e);
});
num++;
})(dl[i], i);
if (!num) Deferred.next(function () { ret.call() });
ret.canceller = function () {
for (var i in dl) if (dl.hasOwnProperty(i)) {
dl[i].cancel();
}
};
return ret;
};
Deferred.loop = function (n, fun) {
var o = {
begin : n.begin || 0,
end : (typeof n.end == "number") ? n.end : n - 1,
step : n.step || 1,
last : false,
prev : null
};
var ret, step = o.step;
return Deferred.next(function () {
function _loop (i) {
if (i <= o.end) {
if ((i + step) > o.end) {
o.last = true;
o.step = o.end - i + 1;
}
o.prev = ret;
ret = fun.call(this, i, o);
if (Deferred.isDeferred(ret)) {
return ret.next(function (r) {
ret = r;
return Deferred.call(_loop, i + step);
});
} else {
return Deferred.call(_loop, i + step);
}
} else {
return ret;
}
}
return (o.begin <= o.end) ? Deferred.call(_loop, o.begin) : null;
});
};
Deferred.repeat = function (n, fun) {
var i = 0, end = {}, ret = null;
return Deferred.next(function () {
var t = (new Date()).getTime();
do {
if (i >= n) return null;
ret = fun(i++);
} while ((new Date()).getTime() - t < 20);
return Deferred.call(arguments.callee);
});
};
Deferred.register = function (name, fun) {
this.prototype[name] = function () {
var a = arguments;
return this.next(function () {
return fun.apply(this, a);
});
};
};
Deferred.register("loop", Deferred.loop);
Deferred.register("wait", Deferred.wait);
Deferred.connect = function (funo, options) {
var target, func, obj;
if (typeof arguments[1] == "string") {
target = arguments[0];
func = target[arguments[1]];
obj = arguments[2] || {};
} else {
func = arguments[0];
obj = arguments[1] || {};
target = obj.target;
}
var partialArgs = obj.args ? Array.prototype.slice.call(obj.args, 0) : [];
var callbackArgIndex = isFinite(obj.ok) ? obj.ok : obj.args ? obj.args.length : undefined;
var errorbackArgIndex = obj.ng;
return function () {
var d = new Deferred().next(function (args) {
var next = this._next.callback.ok;
this._next.callback.ok = function () {
return next.apply(this, args.args);
};
});
var args = partialArgs.concat(Array.prototype.slice.call(arguments, 0));
if (!(isFinite(callbackArgIndex) && callbackArgIndex !== null)) {
callbackArgIndex = args.length;
}
var callback = function () { d.call(new Deferred.Arguments(arguments)) };
args.splice(callbackArgIndex, 0, callback);
if (isFinite(errorbackArgIndex) && errorbackArgIndex !== null) {
var errorback = function () { d.fail(arguments) };
args.splice(errorbackArgIndex, 0, errorback);
}
Deferred.next(function () { func.apply(target, args) });
return d;
};
};
Deferred.Arguments = function (args) { this.args = Array.prototype.slice.call(args, 0) };
Deferred.retry = function (retryCount, funcDeferred, options) {
if (!options) options = {};
var wait = options.wait || 0;
var d = new Deferred();
var retry = function () {
var m = funcDeferred(retryCount);
m.
next(function (mes) {
d.call(mes);
}).
error(function (e) {
if (--retryCount <= 0) {
d.fail(['retry failed', e]);
} else {
setTimeout(retry, wait * 1000);
}
});
};
setTimeout(retry, 0);
return d;
};
Deferred.methods = ["parallel", "wait", "next", "call", "loop", "repeat", "chain"];
Deferred.define = function (obj, list) {
if (!list) list = Deferred.methods;
if (!obj) obj = (function getGlobal () { return this })();
for (var i = 0; i < list.length; i++) {
var n = list[i];
obj[n] = Deferred[n];
}
return Deferred;
};
this.Deferred = Deferred;
(function ($) {
function wrap (obj) {
obj.toJSDeferred = function () {
return Deferred.absorb(this);
};
obj.next = function (fun) {
return Deferred.absorb(this).next(fun);
};
obj.error = function (fun) {
return Deferred.absorb(this).error(fun);
};
obj.done(function (v) {
if (obj._next) obj._next._fire('ok', v);
});
obj.fail(function (v) {
if (obj._next) obj._next._fire('ok', v);
});
var orig_promise = obj.promise;
obj.promise = function () {
return wrap(orig_promise.apply(this, arguments));
};
return obj;
}
Deferred.absorb = function (obj) {
var ret = new Deferred();
ret.progress = function () {};
obj.done(function (v) {
if (v.toJSDeferred) delete v.toJSDeferred;
ret.call(v);
});
obj.fail(function (v) {
if (v.toJSDeferred) delete v.toJSDeferred;
ret.fail(v);
});
if (obj.progress) obj.progress(function (v) {
ret.progress(v);
});
return ret;
};
var orig_Deferred = $.Deferred;
$.Deferred = function (fun) {
return wrap(orig_Deferred.apply(this, arguments));
};
var orig_ajax = $.ajax;
$.ajax = function () {
return orig_ajax.apply(this, arguments);
};
var orig_isDeferred = Deferred.isDeferred;
Deferred.isDeferred = function (obj) {
return orig_isDeferred(obj) || !!(obj && obj.toJSDeferred);
};
$.JSDeferred = Deferred;
})(jQuery);
<div class="col-sm-9" >
<div class="row">
<button type="button" class="btn btn-danger" ng-click="back()">
<< Back
</button>
<h1>{{ Title }}</h1>
<form class="form-horizontal" role="form">
<div class="form-group" ng-repeat="Field in Model.fields">
<div class="col-sm-3">
<label for="inputfield" >{{ Field.Label }}</label>
</div>
<div class="col-sm-9" >
<input type="{{Field.inputType}}" class="form-control" id="inputfield" ng-model="Field.FieldValue" placeholder="{{ Field.Label }}" />
</div>
</div>
<div class="form-group">
<div class="col-sm-3"></div>
<div class="col-sm-9">
<div class="checkbox">
<label>
<button type="button" class="btn btn-success" ng-click="Update(Model)" ng-show="!Loading">Update</button>
</label>
</div>
</div>
</div>
</form>
</div>
<div class="col-sm-12">
<div class="progress" ng-show="Loading">
<div class="progress-bar progress-bar-striped active" role="progressbar" aria-valuenow="100" aria-valuemin="0" aria-valuemax="45" style="width: 100%">
<i>Loading record..</i>
</div>
</div>
</div>
</div>
<div class="col-sm-9" >
<div class="row">
<button type="button" class="btn btn-danger" ng-click="back()">
<< Back
</button>
<form class="form-horizontal" role="form">
<div class="form-group" ng-repeat="Field in Model.fields">
<div class="col-sm-3">
<label for="inputfield" class="control-label">{{ Field.Label }}</label>
</div>
<div class="col-sm-9" >
<input type="{{Field.inputType}}" class="form-control" id="inputfield" ng-model="Field.FieldValue" placeholder="{{ Field.Label }}" />
</div>
</div>
<div class="form-group">
<div class="col-sm-3"></div>
<div class="col-sm-9">
<div class="checkbox">
<label>
<button type="button" class="btn btn-success" ng-click="Update(Model)" ng-show="!Loading">Update</button>
</label>
</div>
</div>
</div>
</form>
</div>
</div>