      1 // ==========================================================================
      2 // Project:   The M-Project - Mobile HTML5 Application Framework
      3 // Copyright: �2010 M-Way Solutions GmbH. All rights reserved.
      4 // Creator:   Dominik
      5 // Date:      29.10.2010
      6 // License:   Dual licensed under the MIT or GPL Version 2 licenses.
      7 //            http://github.com/mwaylabs/The-M-Project/blob/master/MIT-LICENSE
      8 //            http://github.com/mwaylabs/The-M-Project/blob/master/GPL-LICENSE
      9 // ==========================================================================
     10
     11 m_require('core/utility/logger.js');
     12
     13 /**
     14  * @class
     15  *
     16  * The observable knows all observers, mainly views, and pushes updates if necessary.
     17  *
     18  * @extends M.Object
     19  */
     20 M.Observable = M.Object.extend(
     21 /** @scope M.Observable.prototype */ {
     22
     23     /**
     24      * The type of this object.
     25      *
     26      * @type String
     27      */
     28     type: 'M.Observable',
     29
     30     /**
     31      * List that contains pairs of an observer with an observable. An observer is tightened to one
     32      * observable, but one observable can have multiple observers.
     33      *
     34      * @type Array|Object
     35      */
     36     bindingList: [],
     37
     38     /**
     39      * Attach an observer to an observable.
     40      *
     41      * @param {String} observer The observer.
     42      * @param {String} observable The observable.
     43      */
     44     attach: function(observer, observable) {
     45         this.bindingList.push({
     46             observer: observer,
     47             observable: observable
     48         });
     49     },
     50
     51     /**
     52      * Detach an observer from an observable.
     53      *
     54      * @param {String} observer The observer.
     55      */
     56     detach: function(observer) {
     57         /* grep is a jQuery function that finds
     58          * elements in an array that satisfy a certain criteria.
     59          * It works on a copy so we have to assign the "cleaned"
     60          * array to our bindingList.
     61          */
     62         this.bindlingList = $.grep(this.bindlingList, function(value, index) {
     63                 return value.observer !== observer;
     64         });
     65     },
     66
     67     /**
     68      * Notify all observers that observe the property behind 'key'.
     69      *
     70      * @param {String} key The key of the property that changed.
     71      */
     72     notifyObservers: function(key) {
     73         _.each(this.bindingList, function(entry){
     74             if(key === entry.observable){
     75                 entry.observer.contentDidChange();
     76             }
     77         });
     78     }
     79
     80 });