Create an account

Very important

  • To access the important data of the forums, you must be active in each forum and especially in the leaks and database leaks section, send data and after sending the data and activity, data and important content will be opened and visible for you.
  • You will only see chat messages from people who are at or below your level.
  • More than 500,000 database leaks and millions of account leaks are waiting for you, so access and view with more activity.
  • Many important data are inactive and inaccessible for you, so open them with activity. (This will be done automatically)


Thread Rating:
  • 709 Vote(s) - 3.54 Average
  • 1
  • 2
  • 3
  • 4
  • 5
angular js model relationships

#1
I've been trying out Angular JS for the past couple of days and one thing I can't figure out is how to work with relationships between models.

The project I'm working on has a Users model and an Accounts model. I have it set up on my database that each Account has a field called 'ownedBy' which is a foreign key reference to the id of the user that owns that account.

In Angular I have the following set up in a file called main.js

var myApp = angular.module('myApp', ['ngResource']);

var Users = myApp.factory('Users', function($resource) {
var User = $resource('http://api.mydomain.ca/users/:id',
{id:'@id'},
{});
return User;
});

var Accounts = myApp.factory('Accounts', function($resource) {
var Accounts = $resource('http://api.mydomain.ca/accounts/:id',
{id:'@id'},
{});
return Accounts;
});


function UsersCtrl($scope, Users) {
$scope.users = Users.query();
}

function AccountsCtrl($scope, Accounts) {
$scope.accounts = Accounts.query();
}

and the following template

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title>Angular Test</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">

<link rel="stylesheet" href="/bootstrap/css/bootstrap.min.css?v=2.2.1">
</head>
<body>
<div ng-app="myApp">
<div ng-controller="UsersCtrl">
<table class="table table-striped">
<thead>
<tr>
<th>ID</th>
<th>First Name</th>
<th>Last Name</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="user in users">
<td>{{user.id}}</td>
<td>{{user.firstName}}</td>
<td>{{user.lastName}}</td>
</tr>
</tbody>
</table>
</div>
<div ng-controller="AccountsCtrl">
<table class="table table-striped">
<thead>
<tr>
<th>ID</th>
<th>Owned By</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="account in accounts">
<td>{{account.id}}</td>
<td>{{account.ownedBy}}</td>
</tr>
</tbody>
</table>
</div>
</div>
<script src="http://code.jquery.com/jquery-latest.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.0.4/angular.min.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.0.4/angular-resource.min.js"></script>
<script src="/bootstrap/js/bootstrap.min.js?v=2.2.1"></script>
<script src="js/main.js"></script>
</body>
</html>

and this is working. It pulls a JSON resource from my REST server and displays it in a table. What's the next step I need to take to end up with one table that shows users and their account numbers? (the equivalent of a database JOIN?) Is there a different way to do it for a one to many relationship? (ie... an account has many transactions)

Thanks for the help :)
Reply

#2
`$resource` doesn't contain any way to deal with relationships that aren't handled by the server, but it's pretty simply with `$http`:

<!-- language: lang-js -->

module.factory( 'UserService', function ( $http, $q ) {
return {
get: function getUser( id ) {
// We create our own promise to return
var deferred = $q.defer();

$http.get('/users/'+id).then( function ( user ) {
$http.get('/accounts/'+user.id).then( function ( acct ) {

// Add the account info however you want
user.account = acct;

// resolve the promise
deferred.resolve( user );

}, function getAcctError() { deferred.reject(); } );
}, function getUserError() { deferred.reject(); } );

return deferred.promise;
}
};
});

And then in your controller, you can just use it like any other promise:

<!-- language: lang-js -->

UserService.get( $scope.userId ).then( function ( user ) {
$scope.user = user;
});

And it's available for your template!

<!-- language: lang-html -->

<div>
User: "{{user.firstName}} {{user.lastName}}" with Acct ID "{{user.acct.id}}".
</div>
Reply

#3
I use [js-data][1] if I need relationships in the UI. The library handles relationships and data modelling pretty elegantly in general. I have found it easier to use even if you are just looking for a nice API interface. I prefer it to ngResource.

In your case you would have a model for User and model for Account

`src/app/data/account.model.coffee`


angular.module 'app.data' #this can be your module name
.factory 'Account', (DS) ->
DS.defineResource
name: 'account'
endpoint: 'accounts'
relations:
belongsTo:
user:
localKey: 'userId'
localField: 'user'

`src/app/data/user.model.coffee`

angular.module 'app.data'
.factory 'User', (DS) ->

DS.defineResource
name: 'user'
endpoint: 'users'
relations:
belongsTo:
account: #make sure this matches the 'name' property of the other model
foreignKey: 'userId'
localField: 'account'

[1]:

[To see links please register here]

Reply



Forum Jump:


Users browsing this thread:
1 Guest(s)

©0Day  2016 - 2023 | All Rights Reserved.  Made with    for the community. Connected through