2016-08-23 3 views
0

옵션이 동적 일 때 jQueryUI selectmenu를 Meteor 앱에서 작동시키는 데 문제가 있습니다. 내가 사용하고 있습니다 :동적 옵션을 사용하여 jQueryUI selectmenu를 Meteor Blaze 템플릿에 작성하는 방법

  • 유성을 1.4.1
  • jQuery를 2.2.4
  • jQueryUI 1.11.4
  • lodash

physiocoder said on a different question 4.15.0 , "유성 반응성 힘 당신에게로를 DOM 업데이트 담당 담당자를 선택하십시오. "

여기가 내 문제의 근본이라는 것을 알고 있습니다. 따라서 페이지/템플릿으로 Meteor가 모든 페이지 컨텐츠/데이터를로드 한 다음 DOM 컨트롤을 jQueryUI의 위젯으로 넘길 수 있다면 아무런 문제가 없습니다. 그러나 나는 케익을 먹고 싶을 때가 있습니다. Meteor가 반응적으로 jQueryUI 위젯 (특히 selectmenu)의 옵션을 피드하고 싶지만 여전히 jQueryUI가 스타일/테마를 처리하도록하고 싶습니다.

템플릿 onRendered 함수에서 jQueryUI 위젯을 초기화하는 것은 잘 작동하며 필요에 따라 템플릿 onDestroyed 함수에서 jQueryUI 위젯을 파괴한다. 옵션 템플릿의 onRendered 함수에서 selectmenu('refresh')을 호출하면 새 옵션을 사용할 수있을 때 선택 메뉴가 새로 고쳐집니다. 그러나 옵션 메뉴를 반응 적으로 제거하여 옵션 메뉴가 새롭고 정확한 UI 상태로 새로 고쳐 지도록 옵션을 반듯이 제거하면 효과적으로 새로 고침을 할 수있는 곳을 찾을 수 없습니다 - 옵션 템플리트가 아닌 Meteor 데이터 컨텍스트를 변경하는 이벤트의 끝이 아닙니다. onDestroyed 함수가 아니라 적절한 데이터 소스에 연결된 Tracker.autorun 함수가 아닙니다.

HTML :

<head> 
    <title>Proof of Concept</title> 
</head> 

<body> 
    <div id="myApp"> 
    {{> myForm}} 
    </div> 
</body> 

<template name="myForm"> 
    <div> 
    <div id="selectedEntries"> 
     <h3>Selected Entries</h3> 
     <ul class="display-list"> 
     {{#each entry in selectedEntries}} 
      {{> myForm_entry entry}} 
     {{/each}} 
     </ul> 
    </div> 

    <br/> 

    <form id="includeEntry"> 
     <select name="entryToInclude" id="entryToInclude"> 
     {{#each potentialEntry in availableEntries}} 
      {{> myForm_option potentialEntry}} 
     {{/each}} 
     </select> 
     <input type="submit" value="Include Entry"> 
    </form> 
    </div> 
</template> 

<template name="myForm_entry"> 
    <li> 
    <div class="button removeEntry" data-id="{{_id}}">X</div> 
    <span>{{name}}</span> 
    </li> 
</template> 

<template name="myForm_option"> 
    <option value="{{_id}}">{{name}}</option> 
</template> 

자바 스크립트 다음 #entryToInclude의 selectmenu 단지 선택된 항목을 포함하고 있습니다

Template.myForm.helpers({ 
    availableEntries: function() { 
    return _.filter(Session.get('someEntries'), function(o) { 
     return Session.get('selectedEntryIds').indexOf(o._id) == -1; 
    }); 
    }, 
    selectedEntries: function() { 
    return _.filter(Session.get('someEntries'), function(o) { 
     return Session.get('selectedEntryIds').indexOf(o._id) != -1; 
    }); 
    } 
}); 

Template.myForm.events({ 
    'submit #includeEntry': function (event) { 
    event.preventDefault(); 

    if (_.isEmpty(Session.get('selectedEntryIds'))) { 
     Session.set('selectedEntryIds', [$('#entryToInclude').val()]); 
    } else { 
     let selectedEntryIds = Session.get('selectedEntryIds'); 
     selectedEntryIds.push($('#entryToInclude').val()); 
     Session.set('selectedEntryIds', selectedEntryIds); 
    } 
    $('#entryToInclude').selectmenu('refresh') 
    }, 
    'click .removeEntry': function (event) { 
    event.preventDefault(); 

    let selectedEntryIds = Session.get('selectedEntryIds'); 
    selectedEntryIds = _.pull(selectedEntryIds, $(event.target).parent().attr('data-id')); 
    Session.set('selectedEntryIds', selectedEntryIds); 
    } 
}); 

Template.myForm.onCreated(function() { 
    let someEntries = [{ 
    _id:'1', 
    name:'One' 
    },{ 
    _id:'2', 
    name:'Two' 
    },{ 
    _id:'3', 
    name:'Three' 
    },{ 
    _id:'4', 
    name:'Four' 
    },{ 
    _id:'5', 
    name:'Five' 
    },{ 
    _id:'6', 
    name:'Six' 
    }]; 
    Session.set('someEntries', someEntries); 
    Session.set('selectedEntryIds', []); 
}); 

Template.myForm.onRendered(function() { 
    $('#entryToInclude').selectmenu(); 
    $('input:submit').button(); 
}); 
Template.myForm_entry.onRendered(function() { 
    $('.button').button(); 
}); 
Template.myForm_option.onRendered(function() { 
    if ($('#entryToInclude').is(':ui-selectmenu')) { 
    $('#entryToInclude').selectmenu('refresh'); 
    } 
}); 

Template.myForm_option.onDestroyed(function() { 
    $('#entryToInclude').selectmenu('refresh'); 
}); 

Tracker.autorun(function() { 
    if (Session.get('selectedEntryIds')) { 
    if ($('#entryToInclude').is(':ui-selectmenu')) { 
     $('#entryToInclude').selectmenu('refresh'); 
    } 
    } 
}); 

; 성공적인 선택 직후에 최종 엔트리를 선택하는 것만으로는 아무것도 수행하지 않고 선택 메뉴를 새로 고침한다는 점을 제외하고는 하이 또는 그 이상으로 번호가 매겨진 제 2 엔트리를 선택하는 것은 실제로 후속 엔트리를 선택한다 (예를 들어, 4를 선택한 후 5는 실제로 4 및 6을 선택 함).

답변

0

항목 템플리트의 onRendered 함수에 새로 고침을 추가하면이 작업이 가능합니다.

Template.myForm_entry.onRendered(function() { 
    $('.button').button(); 
    if ($('#entryToInclude').is(':ui-selectmenu')) { 
    $('#entryToInclude').selectmenu('refresh'); 
    } 
}); 

그러나 전체적인 문제에 대한 더 나은 접근법은 인정 될 것입니다.

관련 문제