Model Ember.js ArrayProxy模型数组 目标

Model Ember.js ArrayProxy模型数组 目标,model,ember.js,Model,Ember.js,创建由ArrayController(ArrayProxy)管理的模型数组。 要求 使用ArrayController(ArrayProxy)抽象来封装模型的数组 插入ArrayProxy后自动将输入的对象转换为ArrayProxy 不要在访问时进行惰性转换 示例数据结构 试验失败 动态特性 IRC频道中有人提到尝试使用动态属性。这导致了一个,从逻辑和经验证据来看,是一个递归的结果。毫无疑问,通过使内容同时成为动态生成的变量和“触发器/导出”变量 arrayContentWillChange 同

创建由ArrayController(ArrayProxy)管理的模型数组。 要求

使用ArrayController(ArrayProxy)抽象来封装模型的数组 插入ArrayProxy后自动将输入的对象转换为ArrayProxy 不要在访问时进行惰性转换

示例数据结构 试验失败 动态特性 IRC频道中有人提到尝试使用动态属性。这导致了一个,从逻辑和经验证据来看,是一个递归的结果。毫无疑问,通过使内容同时成为动态生成的变量和“触发器/导出”变量

arrayContentWillChange 同样,这是一个看似递归的结果。收到arrayContentWillChange通知后,我将从给定的数组索引项生成AddressModel。然后,我将旧的索引项设置为创建的模型,并再次触发arrayContentWillChange事件,重复…递归

转换成 tomdale在上面的帖子中提到尝试使用transformFrom和transformTo来转换传入和/或传出数据。这些功能似乎不存在[http://cloud.github.com/downloads/emberjs/ember.js/ember-0.9.8.js]

阵列Proxy模型贴片 tomdale对这个问题的原始解决方案/帖子的建议似乎比jedwood引入的模型实现更具普遍性,但是,in Backbone.js通过使用特殊的模型变量来处理这个问题,我发现它工作得很好

问题
如何扩展ArrayProxy以将所有要管理的传入对象转换为AddressModel?

我采用了Tom Dale提到的方法,该方法覆盖了
replace
方法。它还为
content
属性注册一个观察者,以确保内容是数组的类型化版本,请参阅:

App.ModelArrayProxy=Ember.ArrayProxy.extend({
型号:Ember.required,
_typedArray:函数(对象){
var modelType=this.get('modelType');
var数组=objects.map(函数(项){
//检查项是否为类型的实例
如果(!(modelType的项目实例)){
//创建类型的新实例并传递哈希
返回modelType.create(项目);
}
//只需返回该项,因为它已经是modelType类型
退货项目;
});
返回数组;
},
contentChanged:function(){
如果(!this.get('setTypedContent')){
var content=this.get('content');
this.set('setTypedContent',true);
this.set('content',this._typedArray(content));
this.set('setTypedContent',false);
}
}.观察(“内容”),
替换:功能(idx、amt、对象){
此._super(idx,amt,this._typedArray(objects));
}
});
然后可以将此模型ArrayProxy用作“普通”ArrayProxy:

//模型声明
App.AddressModel=Ember.Object.extend({
...
});
//为给定的模型类型创建代理
App.proxy=App.ModelArrayProxy.create({
内容:[],
模型类型:App.AddressModel
});
var myArray=[{
地址名称:“地址名称1”,
地址:'地址1'},
{
地址名称:“地址名称2”,
地址:'地址2'}];
//使用“普通”对象设置内容
App.proxy.set('content',myArray);
//对数组中的所有项调用“日志”
App.proxy.forEach(函数(项){
item.log();
});
//推动一个正常的物体
App.proxy.pushObject({
地址名称:“地址名称3”,
地址:地址3
});
//推送App.AddressModel的实例
App.proxy.pushObject(App.AddressModel.create({
地址名称:“地址名称4”,
地址:“地址4”
}));
//对数组中的所有项调用“日志”
App.proxy.forEach(函数(项){
item.log();
});​

replace方法帮了大忙!但是,我也希望处理以下事项:
App.AddressModel = Ember.Object.extend({
    address_name: null,
    address: null,
    printme: function() {
        console.log("Just making sure the array turned into an AddressModel");
    },
});

App.addressArray = Ember.ArrayProxy.create({
    transformFrom: function(item) {
    },
    transformTo: function(item) {
    },
    arrayContentWillChange: function(startIdx, removeAmt, addAmt) {
    },
});