2016-10-07 9 views
1

저는 자바 스크립트에는별로 좋지 않지만 최근에는 집계 테이블을 출력하기 위해 라이브러리로 작업해야했습니다. fin-hypergrid을 사용했습니다.javascript : 지정된 데믹스 위치로 함수의 출력을 변경하십시오.

그것과 같이 테이블의 집계 값을 계산할 수 있도록 I 객체 (이 예에서는 rollups.sum (11))은 합산 함수를 삽입해야 할 부분이 있었다 :

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

나는 2 소수점을 반환하는이 값을 변경하려면 및 시도 것 :

rollups.sum(11).toFixed(2) 

그러나, 오류가 있습니다 : "rollups.sum (...을)에서는 toFixed는 함수가 아닙니다."

somethi 시도하면 같은 NG :

는 오류가 발생
parseFloat(rollups.sum(11)).toFixed(2) 

:

이 때문에 함수 객체이어야한다 : "(NaN이"아닌 객체) 새로운 String() "의 속성에 할당 할 수 없습니다."

rollups.sum (11) 함수를 변경하여 소수점 이하 2 자리의 함수 객체를 반환하는 방법이 있는지 알고 싶습니까?

(측면 정보 : rollups.sum (11) 제공하는 모듈에서 제공 :

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

)

내가 인해 데이터 기밀성 문제로 여기 샘플 출력을 게시 할 수 없습니다 죄송합니다. 그러나 여기에 나오는 코드는 다음과 같습니다. 기본적으로 롤업을 변경해야합니다. 소수 자릿수를 주면됩니다. 여기에서 합계 (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

sum (11)의 리턴 값을 표시 할 수 있는가? 어떤 종류의 데이터 구조를 다루고 있습니까? –

+0

죄송 합니다만 데이터가 기밀이므로 샘플 출력을 게시 할 수 없습니다. 그러나, 내가 종교적으로 따르는 예가있다. [link] (https://openfin.github.io/fin-hypergrid/). 기본적으로 "집계"확인란을 클릭하면 값을 합산합니다. 나는 합계 형식을 2 자리 소수점을 출력하도록 변경하려고합니다. 예제 스크립트는 여기 [link] (https://openfin.github.io/fin-hypergrid/js/demo.js)에서 찾을 수 있습니다. – NoobPoke

답변

0

당신은 시도 할 수 있습니다 :

//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); 
}; 
: 괄호 안의 숫자는 브라우저를 만들 것으로 보인다 둘러싸

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

식별자는 숫자 문자

편집 # 2 후 바로 시작할 수없는 한계를 우회

+0

감사합니다. 나는 그것을 시도했지만 오류를 반환합니다 : TypeError : rollups.sum (...). toFixed는 함수가 아닙니다. 어떤 수정이라도 함수 객체를 반환하는 것으로 끝나야한다고 생각합니다. – NoobPoke

+0

셀 렌더링을 재정의하는 방법에 대해 @NoobPoke? 내 편집 된 대답 좀 봐주세요 –

+0

안녕하세요,이 코드는 집계 토글에 대한 정의 바로 뒤에 놓았습니다.그런 다음 모든 셀이 노란색으로 바뀌고 텍스트가 "렌더러가 정의되지 않았습니다." – NoobPoke