2014-10-17 5 views
0

У меня есть Ember.ArrayProxy создан так:Ember массив: не наносить на `removeObject`

Em.ArrayProxy.createWithMixins(Em.Array, Em.MutableArray, Em.SortableMixin, { 
    content   : Em.A(arr), 
    sortProperties : properties, 
    sortAscending : fn ? fn : void(0) 
}).reopen({ 
    isEmpty: function(){ 
    return this.get('length') < 1; 
    } 
}); 

связывания данных работает довольно хорошо, когда я использую pushObject или sortBy на массиве. Но у меня нет обновлений в html, когда я использую removeObject в этом массиве. Как я могу это исправить?

Мои Ember:

DEBUG: ------------------------------- 
DEBUG: Ember  : 1.7.1+pre.c1ec09ad 
DEBUG: Ember Data : 1.0.0-beta.9 
DEBUG: Handlebars : 1.3.0 
DEBUG: jQuery  : 2.0.3 
DEBUG: ------------------------------- 




UPD:

я заметил, очень странное поведение при удалении объектов из списка: console output



Существует мой Simpified шаблон в templates/order/list.handlebars:

<ul class="scrollable_list"> 
    {{#each group in orders}} 
    <li class="group"> 
     <div class="group_title"> 
     Orders at {{format_date group.date f="DD.MM.YYYY"}} 
     <div class="label">{{group.count}}</div> 
     </div> 
    </li> 
    <ul> 
    {{#each order in group.orders}} 
     <li {{bind-attr class=':order order.is_mine order.is_claimed'}}> 
     {{#link-to 'orders.group.show' controller.group order}} 
      {{partial 'order/item'}} 
     {{/link-to}} 
     </li> 
    {{/each}} 
    </ul> 
    {{/each}} 
</ul> 



Объект orders является ArrayProxy из Ember.Object. Массив создается this.create_sortable_array. Каждый объект в массиве имеет такую ​​структуру:

Em.Object.create({ 
    date : date, 
    time : date.getTime(), 
    orders : this.create_orders_array() 
}) 

недвижимость orders является ArrayProxy тоже. Каждый элемент имеет значение DS.Model экземпляра.

Методы:



this.create_orders_array:

create_orders_array: function(){ 
    return this.create_sortable_array([], ['id'], true, function(a, b){ 
    a = Number(a); 
    b = Number(b); 
    return a > b ? 1 : -1 
    }); 
} 



this.create_sortable_array:

create_sortable_array: function(arr, properties, desc, fn){ 
    desc = (typeof desc == 'undefined' || desc == null) ? false : desc; 
    fn = fn || void(0); 
    return Em.ArrayProxy.createWithMixins(
    Em.MutableArray, 
    Em.MutableEnumerable, 
    Em.SortableMixin, { 
     content   : Em.A(arr), 
     sortProperties : properties, 
     sortAscending : fn ? fn : void(0) 
    }).reopen({ 
     isEmpty: function(){ return this.get('length') < 1 } 
    }); 
} 



Шаблон будет представлен в {{outlet orders}} маршрутизатором:

App.OrdersRoute = App.AppRoute.extend({ 
    renderTemplate: function(){ 
    this._super() 
    this.render('order/list', into: 'orders', controller: 'orders') 
    this.render({'order/show', into: 'orders', outlet: 'main_view'}) 
    this.render('order/smart_search', into: 'application', outlet: 'smart_search', controller: 'orders') 
    } 
}); 

ответ

0

Проблема была с третьей стороной Lib, что заменить removeAt метод Array.prototype с собственным методом. Поэтому, если Ember удаляет элементы из массива, он использует собственный removeAt, который был заменен другим. В этом случае некоторые крючки Ember не вызывались, и механизм мутации не смог обнаружить никаких изменений. Спасибо всем за помощь и предложения.

0

Похоже, что это работает хорошо для меня. Вероятно, вы вообще не удаляете элемент из списка.

var arr = [{a:'saf'},{a:'fdsa'},{a:'asd'}]; 
var foo = Em.ArrayProxy.createWithMixins(Em.Array, Em.MutableArray, Em.SortableMixin, { 
    content   : arr, 
    sortProperties : ['a'], 
    sortAscending : true 
}).reopen({ 
    isEmpty: function(){ 
    return this.get('length') < 1; 
    } 
}); 


App.IndexRoute = Ember.Route.extend({ 
    model: function() { 
    Em.run.later(function(){ 
     foo.removeObject(foo.objectAt(1)); 
    },2000); 
    return foo; 
    } 
}); 

http://emberjs.jsbin.com/bufoca/1/edit

+0

Спасибо за ваш пример. Я делаю то же самое с моим массивом. Похоже, что моя структура приложения каким-то образом влияет на поведение «ArrayProxy». –

+0

Можете ли вы добавить шаблон? – Kingpin2k

+0

Конечно. См. ** UPD **. –

Смежные вопросы