2016-10-07 2 views
1

Я не очень хорошо знаком с моим javascript, но недавно мне нужно было работать с библиотекой для вывода агрегированной таблицы. Использул fin-hypergrid.javascript: вывести выход функции в указанное место.

Был частью, где мне нужно вставить функцию SUM (rollups.sum (11) в этом примере) к объекту, так что он может вычислить агрегированное значение в таблице следующим образом:

aggregates = {Value: rollups.sum(11)} 

Я хотел бы изменить это значение для возврата 2 знака после запятой и попробовал:

rollups.sum(11).toFixed(2) 

Однако он дает ошибку: «rollups.sum (...) toFixed не является функцией.»

Если я попробую что-нибудь нг как:

parseFloat(rollups.sum(11)).toFixed(2) 

он выдает ошибку: «не может назначить свойства (новой строки (» NaN «)): не объект»

поэтому он должен быть функцией объекта.

Могу ли я узнать, есть ли способ изменить функцию rollups.sum (11), чтобы вернуть объект функции с двумя десятичными знаками?

(сторона информация: rollups.sum (11) поступает из модуля, который дает:

sum: function(columnIndex) { 
    return sum.bind(this, columnIndex); 
} 

)

К сожалению, я не мог отправить пример вывода здесь в связи с вопросами конфиденциальности данных. Однако, вот код из приведенного ниже примера. Мне в основном нужно менять rollups, чтобы дать десятичные знаки. «11» в сумме (11) здесь относится к «индексу столбца».

window.onload = function() { 

var Hypergrid = fin.Hypergrid; 
var drillDown = Hypergrid.drillDown; 
var TreeView = Hypergrid.TreeView; 
var GroupView = Hypergrid.GroupView; 
var AggView = Hypergrid.AggregationsView; 

// List of properties to show as checkboxes in this demo's "dashboard" 
var toggleProps = [{ 
     label: 'Grouping', 
     ctrls: [ 
      { name: 'treeview', checked: false, setter: toggleTreeview }, 
      { name: 'aggregates', checked: false, setter: toggleAggregates }, 
      { name: 'grouping', checked: false, setter: toggleGrouping} 
     ] 
    } 
]; 

function derivedPeopleSchema(columns) { 
    // create a hierarchical schema organized by alias 
    var factory = new Hypergrid.ColumnSchemaFactory(columns); 
    factory.organize(/^(one|two|three|four|five|six|seven|eight)/i, { key: 'alias' }); 
    var columnSchema = factory.lookup('last_name'); 
    if (columnSchema) { 
     columnSchema.defaultOp = 'IN'; 
    } 
    //factory.lookup('birthState').opMenu = ['>', '<']; 
    return factory.schema; 
} 

var customSchema = [ 
    { name: 'last_name', type: 'number', opMenu: ['=', '<', '>'], opMustBeInMenu: true }, 
    { name: 'total_number_of_pets_owned', type: 'number' }, 
    { name: 'height', type: 'number' }, 
    'birthDate', 
    'birthState', 
    'employed', 
    { name: 'income', type: 'number' }, 
    { name: 'travel', type: 'number' } 
]; 

var peopleSchema = customSchema; // or try setting to derivedPeopleSchema 

var gridOptions = { 
     data: people1, 
     schema: peopleSchema, 
     margin: { bottom: '17px' } 
    }, 
    grid = window.g = new Hypergrid('div#json-example', gridOptions), 
    behavior = window.b = grid.behavior, 
    dataModel = window.m = behavior.dataModel, 
    idx = behavior.columnEnum; 

console.log('Fields:'); console.dir(behavior.dataModel.getFields()); 
console.log('Headers:'); console.dir(behavior.dataModel.getHeaders()); 
console.log('Indexes:'); console.dir(idx); 

var treeView, dataset; 

function setData(data, options) { 
    options = options || {}; 
    if (data === people1 || data === people2) { 
     options.schema = peopleSchema; 
    } 
    dataset = data; 
    behavior.setData(data, options); 
    idx = behavior.columnEnum; 
} 

// Preset a default dialog options object. Used by call to toggleDialog('ColumnPicker') from features/ColumnPicker.js and by toggleDialog() defined herein. 
grid.setDialogOptions({ 
    //container: document.getElementById('dialog-container'), 
    settings: false 
}); 

// add a column filter subexpression containing a single condition purely for demo purposes 
if (false) { // eslint-disable-line no-constant-condition 
    grid.getGlobalFilter().columnFilters.add({ 
     children: [{ 
      column: 'total_number_of_pets_owned', 
      operator: '=', 
      operand: '3' 
     }], 
     type: 'columnFilter' 
    }); 
} 

window.vent = false; 

//functions for showing the grouping/rollup capabilities 
var rollups = window.fin.Hypergrid.analytics.util.aggregations, 
    aggregates = { 
     totalPets: rollups.sum(2), 
     averagePets: rollups.avg(2), 
     maxPets: rollups.max(2), 
     minPets: rollups.min(2), 
     firstPet: rollups.first(2), 
     lastPet: rollups.last(2), 
     stdDevPets: rollups.stddev(2) 
    }, 
    groups = [idx.BIRTH_STATE, idx.LAST_NAME, idx.FIRST_NAME]; 

var aggView, aggViewOn = false, doAggregates = false; 
function toggleAggregates() { 
    if (!aggView){ 
     aggView = new AggView(grid, {}); 
     aggView.setPipeline({ includeSorter: true, includeFilter: true }); 
    } 
    if (this.checked) { 
     grid.setAggregateGroups(aggregates, groups); 
     aggViewOn = true; 
    } else { 
     grid.setAggregateGroups([], []); 
     aggViewOn = false; 
    } 
} 

function toggleTreeview() { 
    if (this.checked) { 
     treeView = new TreeView(grid, { treeColumn: 'State' }); 
     treeView.setPipeline({ includeSorter: true, includeFilter: true }); 
     treeView.setRelation(true, true); 
    } else { 
     treeView.setRelation(false); 
     treeView = undefined; 
     delete dataModel.pipeline; // restore original (shared) pipeline 
     behavior.setData(); // reset with original pipelline 
    } 
} 

var groupView, groupViewOn = false; 
function toggleGrouping(){ 
    if (!groupView){ 
     groupView = new GroupView(grid, {}); 
     groupView.setPipeline({ includeSorter: true, includeFilter: true }); 
    } 
    if (this.checked){ 
     grid.setGroups(groups); 
     groupViewOn = true; 
    } else { 
     grid.setGroups([]); 
     groupViewOn = false; 
    } 
} 
+0

Вы можете предоставить образец вывода вашей функции sum? Я уже тестировал с возвратом вывода цифры и строки в обоих случаях 'parseFloat (rollups.sum (11)). ToFixed (2)' работает нормально –

+0

вы можете показать, какое возвращаемое значение суммы (11) есть, поэтому я могу видеть с какой структурой данных вы имеете дело. –

+0

Прошу прощения, но я не могу опубликовать образец вывода, поскольку данные являются конфиденциальными. Тем не менее, есть пример, который я следую религиозно здесь [link] (https://openfin.github.io/fin-hypergrid/). В основном, если вы нажмете на «агрегатный» флажок, он суммирует значения. Я просто хотел бы попробовать изменить формат суммы для вывода 2 десятичных знака. Сценарий примера можно найти здесь [link] (https://openfin.github.io/fin-hypergrid/js/demo.js). – NoobPoke

ответ

0

вы можете попробовать:

(rollups.sum(11)).toFixed(2) 

ограждающих число в скобках, как сделать браузер обойти ограничение, идентификатор не может начинаться сразу после числового буквального

редактируемого # 2:

//all formatting and rendering per cell can be overridden in here 
dataModel.getCell = function(config, rendererName) { 
    if(aggViewOn) 
    { 
     if(config.columnName == "total_pets") 
     { 
      if(typeof(config.value) == 'number') 
      { 
       config.value = config.value.toFixed(2); 
      } 
      else if(config.value && config.value.length == 3 && typeof(config.value[1]) == 'number') 
      { 
       config.value = config.value[1].toFixed(2); 
      } 
     } 
    } 
    return grid.cellRenderers.get(rendererName); 
}; 
+0

Спасибо, Бод! Я пробовал это, но он возвращает ошибку: TypeError: rollups.sum (...). ToFixed не является функцией. Я думаю, что любая модификация должна завершиться возвратом объекта функции. – NoobPoke

+0

как насчет переопределения ячейки рендеринга, @NoobPoke? взгляните на мой отредактированный ответ, пожалуйста, –

+0

hi Bod, я разместил этот код сразу после определений для агрегатных переключений.Затем все ячейки стали желтыми, а текст «renderer undefined» – NoobPoke

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