2010-04-22 2 views
2

Я работаю с пользовательским интерфейсом, который имеет (YUI2) JSON DataSource, который используется для заполнения DataTable. Я хотел бы сделать это, когда значение в таблице будет обновлено, выполните простую анимацию в ячейке, значение которой изменилось.Использование cellUpdateEvent с данными YUI DataTable и JSON DataSource

Вот некоторые важные фрагменты кода:

var columns = [ 
    {key: 'foo'}, 
    {key: 'bar'}, 
    {key: 'baz'} 
]; 

var dataSource = new YAHOO.util.DataSource('/someUrl'); 
dataSource.responseType = YAHOO.util.DataSource.TYPE_JSON; 
dataSource.connXhrMode = 'queueRequests'; 
dataSource.responseSchema = { 
    resultsList: 'results', 
    fields: [ 
     {key: 'foo'}, 
     {key: 'bar'}, 
     {key: 'baz'} 
    ] 
}; 

var dataTable = new YAHOO.widget.DataTable('container', columns, dataSource); 

var callback = function() { 
    success: dataTable.onDataReturnReplaceRows, 
    failure: function() { 
     // error handling code 
    }, 
    scope: dataTable 
}; 

dataSource.setInterval(1000, null, callback); 

И вот что я хотел бы сделать с ним:

dataTable.subscribe('cellUpdateEvent', function(record, column, oldData) { 
    var td = dataTable.getTdEl({record: record, column: column}); 
    YAHOO.util.Dom.setStyle(td, 'backgroundColor', '#ffff00'); 
    var animation = new YAHOO.util.ColorAnim(td, { 
     backgroundColor: { 
      to: '#ffffff'; 
     } 
    }); 
    animation.animate(); 
}; 

Однако, это не похоже, используя cellUpdateEvent работы. Является ли ячейка, обновленная в результате обратного вызова setInterval, даже запускает cellUpdateEvent?

Возможно, я не совсем понимаю, что происходит под капотом, с DataTable. Возможно, вся таблица перерисовывается каждый раз, когда данные запрашиваются, поэтому она не знает или не заботится об изменениях отдельных ячеек ?. Является ли решение написать мою собственную специальную функцию для замены onDataReturnReplaceRows? Может ли кто-нибудь просветить меня о том, как я могу это сделать?

Edit:

После копаться Datatable-debug.js, похоже onDataReturnReplaceRows не будет стрелять cellUpdateEvent. Он вызывает reset() на RecordSet, который поддерживает DataTable, который удаляет все строки; он снова заполняет таблицу свежими данными. Я попытался изменить его, чтобы использовать onDataReturnUpdateRows, но это, похоже, не работает.

Edit2:

Для достижения контроля, что я хотел, я закончил писать свой собственный <ul>-список данных, который сделал немного больше смысла для этой проблемы я пытался решить. Нижеприведенный ответ Дженни должен помочь решить эту проблему для большинства других, поэтому я принял это решение.

ответ

3

cellUpdateEvent только срабатывает в ответ на вызов updateCell(). Вы хотите подписаться на cellFormatEvent. Были несколько других вопросов, в вашем коде, так что это должно работать:

dataTable.subscribe('cellFormatEvent', function(o) { 
    YAHOO.util.Dom.setStyle(o.el, 'backgroundColor', '#ffff00'); 
    var animation = new YAHOO.util.ColorAnim(o.el, { 
     backgroundColor: { 
      to: '#ffffff' 
     } 
    }); 
    animation.animate(); 
}); 

var callback = { 
    success: dataTable.onDataReturnReplaceRows, 
    failure: function() { 
     // error handling code 
    }, 
    scope: dataTable 
}; 
dataSource.setInterval(1000, null, callback); 
+0

Спасибо за регистрацию, просто чтобы дать ответ: - Теперь я ближе к этому. Тем не менее, кажется, что «cellFormatEvent» запускается с каждым интервалом, который опрошен DataSource.Есть ли еще одно событие, которое будет срабатывать только при изменении данных в самой ячейке? Или, возможно, я должен использовать другой метод обратного вызова, чем onDataReturnReplaceRows? У меня такое ощущение, что то, о чем я прошу, выходит за рамки возможностей функциональности YUI DataTable/DataSource по умолчанию, и мне придется написать свой собственный callback-запрос setInterval или что-то в этом роде. –

+0

Нет события, которое срабатывает, когда данные изменяются с предыдущего значения, так что это зависит от вас, чтобы определить. Чтобы настроить более подробное обновление, вы можете определить свою собственную функцию обработчика успешного вызова, которая вызывает updateRow или updateCell для определенных частей данных, которые были изменены, вместо повторного рендеринга всех строк таблицы (что и делает onDataReturnReplaceRows). –

+0

Что я в конечном итоге сделал, это написать пользовательский список данных, который соответствует моим потребностям немного лучше. Это позволило мне получить более тонкий контроль над представленными данными и сделать семантически смысл (а также быть более легким). Однако, спасибо за ваш ответ; Я соглашусь с этим, потому что считаю, что это поможет решить проблему для других, которые ищут похожие решения. –

-1
dataTable.subscribe('cellFormatEvent', 

функция (о) { YAHOO.util.Dom.setStyle (o.el, 'BackgroundColor', ' # FFFF00'); var animation = new YAHOO.util.ColorAnim (o.el, { backgroundColor: { to: '#ffffff' } }); animation.animate(); });

var callback = { 
    success: dataTable.onDataReturnReplaceRows, 
    failure: function() { 
     // error handling code 
    }, 
    scope: dataTable 
}; 
dataSource.setInterval(1000, null, callback); 

Этот пример не будет работать beceause вы добавили интервал, и это не является правильным решением. Потому что функция будет вызываться каждый раз.

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