Back

alloy Model: 中的config, Model , Collection

发布时间: 2015-04-04 01:58:00

refer to:  http://docs.appcelerator.com/titanium/latest/#!/guide/Alloy_Collection_and_Model_Objects

Alloy 中包含了 backbone框架. 用的是0.9.2的版本.  

Model: 是app的核心. 因为我们需要展示数据. model就是数据.  backbone可以帮我们实现方便的 data-view binding. 说的通俗一些:

如果某个controller的数据发生了变化,  而页面需要更新这个数据的话, 之前需要人肉操作. 

但是有了 数据绑定( data binding )之后, 就可以实现 页面数据的自动刷新. 

model的例子:

exports.definition  = {
  config: {}, 
  extendModel: function(Model){
    _.extend(Model.prototype, {});
    return Model;
  },  
  extendCollection: function(Collection){
    _.extend(Collection.prototype, {});
    return Collection;
  }

}

如果希望在controller中调用model, 就这样:

var book = Alloy.createModel('book', {title: 'Refactoring', author: 'Martin Fowler'});
var title = book.get('title');
var author = book.get('author'); 
$.label.text = title + 'by' + author; 

Config 的例子:

exports.definition  = {
  config: {
    "columns" : {           // 定义每个列.
      "title": "String", 
      "author": "String"
    }, 
    "defaults" : {          // 定义默认值
      "title" : '-',  
      "author" : '-'
    },
    "adapter" : {           // 使用sqlite 数据库
      "type" : "sql", 
      "collection_name" : "books" 
    }
  }, 
  extendModel: function(Model){
    _.extend(Model.prototype, {});
    return Model;
  },  
  extendCollection: function(Collection){
    _.extend(Collection.prototype, {});
    return Collection;
  }

}

extends model 

可以扩展某个model. 例如, validate()方法是backbone预设好的方法,但是没有做具体的实现.  它在某个model的 set, save方法之前执行. 也在 被调用 isValid()的时候执行. 

例如: 

exports.definition  = {
  config: {}, 
  extendModel: function(Model) { 
    _.extend(Model.prototype, {
      validate: function(attrs){ 
        for (var key in attrs) { 
           var value = attrs[key];
           if (key === 'title'){
              if (value.length <= 0)  return "error: no title";                  
            } 
        }
      }, 
      customProperty: 'book', 
      customFunction: function(){  
        Ti.API.info('I am a book model');
      }
    })
    return Model
  } 
}

在controller中这样操作: 

var book = Alloy.createModel('book', {title: 'Refactoring', author: 'Martin' });
if(book.isValid() && book.customProperty == 'book') {
    book.save();
} else{
    book.destroy();
}

Collection

是某个model的多个instance集合. 只要你定义了某个Model (例如叫 book), 那么Alloy 就会自动为我们定义好对应的Collection

var books = Alloy.createCollection('book'); 
books.fetch(); 

下面是可以获取一个全局单例变量: (global singleton instance) :

var global_book = Alloy.createCollections.instance('book'); 

extend Collection

可以扩展对应的collection, 例如:

exports.definition = {
  config: {},
  extendModel: function(Model){
    _.extend(Model.prototype, {});
    return Model; 
  } ,
  extendCollection: function(Collection){
    _.extend(Collection.prototype, {
      comparator: function(book){  //对 comparator的实现
        return book.get('title');
      }
    });
    return Collection;
  }
}

注意: Model, Collection只支持on, off, trigger , 不支持 Titanium 的add/removeEventListener, fireEvent()

Model 和 Collection 都可以调用这三个方法.例如: 

var books = Alloy.createCollection('book');
function  = event_callback(context){
  var output = context || 'lala'; 
  Ti.API.info(output);
}
books.on('change', event_callback);  //开始绑定
books.trigger('change', 'lala');   //触发事件
books.off();  // 取消一切事件绑定 

Back