@ waveaccess/choice-hospital-systems
 
    
        (Presentation Model) framework
        
        for single page applications (SPA)
      
vs
        (Presentation Model) framework
        
        for SPA
      
Making Decisions
I think empty folders and empty files are two of the pivotal innovations in Rails that have encouraged us to write clean applications since the framework appeared.
DHH
Best Practices
by Inversion of Control
 
       
      
       Presentation Model framework
       
       for single page applications
      
 
        
       
        
        Data Bindings
       Presentation Model framework
       
       for single page applications
      
        
angular.module('a', [])
.service('aserv',...)
.directive('adir',...)
.controller(...)
.filter(...)
angular.module('b', ['a'])
.controller(function(adir){ // here is injection
  //use adir
})
//...
        
      
    
        
angular.module('app', [])
.controller('userCtrl',function($scope){
  $scope.users = [{ name: 'Misko' }, {name: 'Voita'}, {name: 'Minar'}]
})
//view
html ng-app="app">
  ...
  
    
      - {{ user.name }}
...
html>
      
     
      
                 
                 
               
      
                 
$('#input').on('input', function(){
  $('#out').text($(this).value());
})
                 
               
               
                 
var DocumentRow = Backbone.View.extend({
  tagName: "li",
  className: "document-row",
  events: {
    "change .input": "input"
  },
  initialize: function() {
    this.listenTo(this.model, "change", this.render);
  }
  render: function() {... }
  input: function() {... }
});
                 
               
      Find more generic way (DRY)
Just say "WHAT TO DO", not "HOW TO DO".
	      
 {{message}} 
	    
	  
	  machine should do it for me!
	
//directives
function model(el, scope) {...}
function interpolate(el, scope) {...}
//complie document
var scope = {} //container for data
$("[ng-model]")
.each(function(el){ model(el, scope) })
$("*:contains('{{')")
.each(function(el){ interpolate(el, scope) })
	  
	
	
	
function interpolate(el, scope) {
  var template = el.innerHTML; //get & remember template
  var prop = /{{(.+)}}/.exec(template)[1];
  //imagine we have such method,
  //calling callback when prop changed
  scope.$watch(prop, function() {
    console.log(scope)
    el.innerHTML = template.replace('{{' + prop +'}}', scope[prop]);
  })
}
	  
	
	ng-interpolate.js
	
	
function model(el, scope) {
  var model = el.getAttribute('ng-model')
  $(el).on('input',function(){
    var data = el.value;
    scope.apply(function(){
      scope[model] = data;
    })
  })
  scope.watch(model, function(val) {
    el.value = scope[model];
  })
}
	  
	
	ng-input.js
	
	// Scope
$watch: function(watchExp, listener,){
   this.$$watchers.push(watchExp, listener)
}
$digest: function() {
   var dirty = true;
   while(dirty || iteration > limit) {
     for $watcher in $$watchers {
       var newValue = eval($watcher.watchExp)
       if($watcher.oldValue != newValue){
         $watcher.listener(newValue, oldValue)
       }
     }
   }
}
	
      
 rootScope.js
	