2015-04-30 2 views
1

Там, кажется, разница междуCanJS: Model.findAll() против нового Model.List()

can.Component.extend({ 
    viewModel: { 
    items: new Model.List(), 
    updateItems: function(viewModel) { 
     viewModel.attr('items', new Model.List({})); 
    } 
} 

и

can.Component.extend({ 
    viewModel: { 
    items: new Model.List(), 
    updateItems: function(viewModel) { 
     Model.findAll({}, function(items) { 
     viewModel.attr('items', items); 
     }); 
    } 
} 

в том, что бывшие спусковые изменить события по пунктам но последний нет, посмотрите пожалуйста jsfiddle.

  1. Может кто-нибудь объяснить, почему? Насколько я понимаю, документы как new Model.List(), так и Model.findAll() возвращают can.Model.List.
  2. Событие не запускается, когда результатом является пустой список. Если это не вызовет хотя бы событие length?

ответ

0

Для того чтобы быть ясным, Model.findAll() возвращает обещание, которое разрешает список.

Причина заключается в том, что:

Model.findAll({}, function(items) { 
    viewModel.attr('items', items); 
    }); 

не изменяет длину 'пунктов. «items» установлен в список, который уже имеет длину, и эта длина никогда не изменяется. Таким образом, нет, «{items} length» не вызывает обратный вызов при изменении элементов или длины, только когда изменяется текущая длина элементов.

Это отличается:

viewModel.attr('items', new Model.List({})); 

Какие наборы 'элементы' в первоначально пустой список. Позже этот список обновляется с помощью элементов, что изменяет свойство длины списка элементов.

+0

Спасибо, Джастин, я понимаю, что понимаю техническое объяснение. Я бы ожидал изменений событий, когда я слушаю поле модели, независимо от того, как это поле изменилось. Каким будет рекомендуемый способ достижения этого? Есть ли лучший способ настройки событий или я должен позвонить своему собственному обработчику внутри 'findAll' callback? – peterwimsey

+0

Вычисления с помощью плагина define - лучший способ передать это. Они могут прослушивать различные значения и обновлять только один раз. Я действительно не слушаю события в моих приложениях CanJS. Посмотрите пример MakeModelYear: http://canjs.com/docs/can.List.plugins.promise.html и эту скрипту: http://jsbin.com/tehobu/4/edit?html,js,output –

+0

" Я бы ожидал изменений событий, когда я слушаю поле модели, независимо от того, как это поле изменилось ». Скажем, существовал объект со свойствами, такими как root.base.child.prop. Если вы слушаете child.prop, вы не должны ожидать уведомления об изменении root.base. Я не думаю, что все работает так. –

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