Определить контроллер Apex в домашнем компоненте javascript

Я создал пользовательский объект Code_Postal__c. Цель состоит в том, чтобы проверить в моей записи Code_Postal__c название города с тем же почтовым индексом, который был установлен пользователем на странице записи учетной записи.

Мне не нужно и я не хочу создавать пользовательскую страницу Visualforce.

Забавный факт заключается в том, что мое поле предварительно заполнено хорошими значениями, но исследование не работает. Когда я проверил свою страницу, чтобы проверить, почему мое автозаполнение не работает, я получил следующую ошибку:

**Uncaught ReferenceError: AutoCompleteController is not defined e?retURL=%2F001M000000UyrUl:24
j$.autocomplete.source e?retURL=%2F001M000000UyrUl:24
$.widget._search jquery-ui.js:6563
(anonymous function) jquery-ui.js:413
$.widget.search jquery-ui.js:6555
(anonymous function) jquery-ui.js:413
(anonymous function) jquery-ui.js:6536
handlerProxy**

Вот мой контроллер:

global with sharing class AutoCompleteController {
//private final Movie__c mov; 
private Code_Postal__c cpCheck;
private Account accToCheck;

    // Instance fields
    public String searchTerm {get; set;}
    public String selectedMovie {get; set;}

    // Constructor
    public AutoCompleteController() {

    }
    public AutoCompleteController(ApexPages.StandardController stdController) {
    this.accToCheck = (Account)stdController.getRecord();
    //this.mov= (Movie__c)stdController.getRecord();
}

// JS Remoting action called when searching for a cp
@RemoteAction
global static List<Code_Postal__c> searchMovie(String searchTerm) {
    System.debug('Movie Name is: '+searchTerm );
    List<Code_Postal__c> movies = Database.query('Select Commune__c, Code_Postal__c from Code_Postal__c where Code_Postal__c like \'%' + String.escapeSingleQuotes(searchTerm) + '%\'');
    return movies;
}

}

Вот мой компонент:

    <script type="text/javascript" src="http://code.jquery.com/jquery-1.8.2.js"></script>
<script type="text/javascript" src="http://code.jquery.com/ui/1.9.0/jquery-ui.js"></script>
<link rel="stylesheet" href="http://code.jquery.com/ui/1.9.1/themes/base/jquery-ui.css"/>
<script type="text/javascript">
    /*Create a new variable j$ just to avoid any conflicts with other libraries which may be using $.*/
    var j$ = jQuery.noConflict();
    /*Capture the list of countries in a Array.*/

    /*on Document ready*/
    j$(document).ready(function(){
        var PLACEHOLDER = 'Enter Code_Postal__c Here'; 
        var movieObjects;
        var queryTerm;

        j$('[id$=acc18zip]').autocomplete({
            minLength: 2,
            source: function(request, response) {
                        queryTerm = request.term;

                           AutoCompleteController.searchMovie(request.term, function(result, event){
                            if(event.type == 'exception') {
                                  alert(event.message);
                            } else {
                                 movieObjects = result;
                                 response(movieObjects);
                            }
                        });
                   },
            focus: function( event, ui ) {
                    j$('[id$=acc18zip]').val( ui.item.Code_Postal__c );
                    j$('[id$=acc18city]').val( ui.item.Commune__c );
                    return false;
                    },
            select: function( event, ui ) {
                        j$('[id$=acc18zip]').val( ui.item.Code_Postal__c );
                        return false;
                    },
         })

         .data( "autocomplete" )._renderItem = function( ul, item ) {
            var entry = "<a>" + item.Code_Postal__c + " " +item.Commune__c;

            entry = entry + "</a>";
            entry = entry.replace(queryTerm, "<b>" + queryTerm + "</b>");
            return j$( "<li></li>" )
                .data( "item.autocomplete", item )
                .append( entry )
                .appendTo( ul );
        };

        /* Add or remove placeholder values*/
        j$('[id$=acc18zip]').val(PLACEHOLDER);
        j$('[id$=acc18zip]').on("focus",  function(event){
            j$tgt = j$(event.target);
            if(j$tgt.val() === PLACEHOLDER ){
                j$tgt.val('');
                j$tgt.removeClass('placeHolder');
            }
        });
        j$('[id$=acc18zip]').on( "blur",  function(event){
            j$tgt = j$(event.target);
            if(j$tgt.val() === '' ){
                j$tgt.val(PLACEHOLDER);
                j$tgt.addClass('placeHolder');
            }
        });

    });
</script>  

person Antony Dev    schedule 16.12.2013    source источник
comment
Я не думаю, что вы можете получить доступ к своему контроллеру вершины, если вы не связали его со своей страницей с помощью visualforce, даже для удаленного javascript. Я считал, что если вы хотите получить доступ к SF без VF (даже легкого), вам следует создать службу REST вершины, которую вы можете вызывать с помощью ajax из js. (не уверен на 100%, но я так делал)   -  person Samuel DR    schedule 17.12.2013
comment
Спасибо, я понял! В этом случае я должен использовать набор инструментов Ajax, чтобы подключиться к Salesforce (получить ssid и сделать запрос).   -  person Antony Dev    schedule 03.01.2014
comment
Может быть, вы можете написать это с некоторым кодом в качестве ответа? Это может помочь другим в будущем и не оставить этот вопрос открытым и без ответа.   -  person Samuel DR    schedule 03.01.2014


Ответы (1)


Как я уже сказал, я нашел способ сделать автозаполнение. Он делает запрос и анализирует мою строку. Это не работает с параметром ..='( Я пытаюсь найти способ сделать это динамически и проанализировать мой объект (с элементом?) В любом случае этот пример работает:

Контроллер:

global class cpSearch2{ 
    webService static String searchCP() {
        String pickValues='';
        for(Code_Postal__c cp : [Select Commune__c, Code_Postal__c from Code_Postal__c ]){
               pickValues = pickValues +cp.Code_Postal__c+ ' - ' + cp.Commune__c+'+';
        }
        return pickValues;
    }
}

Мой компонент javascript:

<link rel="stylesheet" href="https://code.jquery.com/ui/1.10.3/themes/smoothness/jquery-ui.css">
<script src="https://code.jquery.com/jquery-1.9.1.js"></script>
<script src="https://code.jquery.com/ui/1.10.3/jquery-ui.js"></script>
<link rel="stylesheet" href="/resources/demos/style.css">
<script src="/soap/ajax/15.0/connection.js" type="text/javascript"></script>
<script src="/soap/ajax/15.0/apex.js" type="text/javascript"></script>
<script>var url = document.URL;
if(url.indexOf('001')!=-1)    
{                
    var sid = document.cookie.match(' sid=([^;]*)')[1];   
    sforce.debug.trace=true;
    sforce.connection.sessionId = sid;
    var stages = sforce.apex.execute("cpSearch2", "searchCP", {});
    var staheArray = stages.toString().split("+");
    $ = jQuery.noConflict();
    $(function() {
        var availableTags = staheArray;
        $( "#acc18zip" ).autocomplete({
            source: availableTags
            });
        $( "#acc18zip" ).on("autocompleteselect", function( event, ui ){
            selectedArray = ui.item.value.split(" - ");
            $("#acc18zip").val(selectedArray[0]);
            $("#acc18city").val(selectedArray[1]);
            return false;  
        });
    });
}
</script>
person Antony Dev    schedule 03.01.2014