询问Salesforce中的Javascript远程处理

询问Salesforce中的Javascript远程处理,javascript,salesforce,remoting,Javascript,Salesforce,Remoting,我正在尝试在Salesforce中使用JavaScript远程处理。我有一个文本框,输入要查找的城市名称。第一次单击搜索按钮时,我得到了正确的结果,但另一次单击时,我得到了许多重复的列。我不知道我哪里出错了。请帮帮我。这是我的密码: 控制器类: global with sharing class AccountRemoter { public static List<Account> account { get; set; } public AccountRemote

我正在尝试在Salesforce中使用JavaScript远程处理。我有一个文本框,输入要查找的城市名称。第一次单击搜索按钮时,我得到了正确的结果,但另一次单击时,我得到了许多重复的列。我不知道我哪里出错了。请帮帮我。这是我的密码:

控制器类:

global with sharing class AccountRemoter {
    public static List<Account> account { get; set; }
    public AccountRemoter() { } 

    @RemoteAction
    global static List<Account> getAccount(String cityName) {
        account = [SELECT Id, Name, City__c, RecordTypeId, RecordType.Name FROM Account WHERE City__c = :cityName];
        return account;
    }
}
<apex:page controller="AccountRemoter">

    <apex:includeScript value="{!$Resource.knockout}"/>
    <apex:includeScript value="{!URLFOR($Resource.kendo, '/js/jquery.min.js')}"/> 

    <script type="text/javascript">
            var VM = function () {
                var self = this;
                self.items = ko.observableArray();

                self.columnNames = ko.computed(function () {
                    if (self.items().length === 0)
                        return [];
                    var props = [];
                    var obj = self.items()[0];

                    for (var name in obj)
                        props.push(name);
                    return props;
                });
           };

        function getRemoteAccount() {
            var cityName = document.getElementById('acctSearch').value;

            Visualforce.remoting.Manager.invokeAction(
                '{!$RemoteAction.AccountRemoter.getAccount}', cityName, function(result, event){
                    if (event.status) {


                       var vm = new VM();

                       ko.applyBindings(vm);

                       //vm.items.removeAll();

                       for (var i = 0; i < result.length; i++){
                            vm.items.push({                                 
                                'Name': result[i].Name,
                                'City': result[i].City__c
                            });
                       }

                    } else if (event.type === 'exception') {
                        document.getElementById("responseErrors").innerHTML =  event.message + "<br/>\n<pre>" + event.where + "</pre>";
                    } else {
                        document.getElementById("responseErrors").innerHTML = event.message;
                    }
                }, 
                {escape: true}
            );
        }
    </script>

    <input id="acctSearch" type="text"/>
    <button onclick="getRemoteAccount()">Search</button>
    <div id="responseErrors"></div>


    <div id="dv">
    <table style="float:left;" Id="mytable">
       <thead >
            <tr data-bind="foreach: columnNames" >
                <th> <span data-bind="text: $data"></span>
                </th>
            </tr>
        </thead>

        <tbody data-bind="foreach: items">
            <tr data-bind="foreach: $parent.columnNames">
                <td data-bind="text: $parent[$data]"></td>
            </tr>
        </tbody>
    </table>
    </div>  

</apex:page>
global与共享类AccountRemoter{
公共静态列表帐户{get;set;}
public AccountRemoter(){}
@远程操作
全局静态列表getAccount(字符串cityName){
account=[选择Id、名称、城市名称、RecordTypeId、RecordType.Name FROM account WHERE City\uuuu c=:cityName];
返回帐户;
}
}
可视页面:

global with sharing class AccountRemoter {
    public static List<Account> account { get; set; }
    public AccountRemoter() { } 

    @RemoteAction
    global static List<Account> getAccount(String cityName) {
        account = [SELECT Id, Name, City__c, RecordTypeId, RecordType.Name FROM Account WHERE City__c = :cityName];
        return account;
    }
}
<apex:page controller="AccountRemoter">

    <apex:includeScript value="{!$Resource.knockout}"/>
    <apex:includeScript value="{!URLFOR($Resource.kendo, '/js/jquery.min.js')}"/> 

    <script type="text/javascript">
            var VM = function () {
                var self = this;
                self.items = ko.observableArray();

                self.columnNames = ko.computed(function () {
                    if (self.items().length === 0)
                        return [];
                    var props = [];
                    var obj = self.items()[0];

                    for (var name in obj)
                        props.push(name);
                    return props;
                });
           };

        function getRemoteAccount() {
            var cityName = document.getElementById('acctSearch').value;

            Visualforce.remoting.Manager.invokeAction(
                '{!$RemoteAction.AccountRemoter.getAccount}', cityName, function(result, event){
                    if (event.status) {


                       var vm = new VM();

                       ko.applyBindings(vm);

                       //vm.items.removeAll();

                       for (var i = 0; i < result.length; i++){
                            vm.items.push({                                 
                                'Name': result[i].Name,
                                'City': result[i].City__c
                            });
                       }

                    } else if (event.type === 'exception') {
                        document.getElementById("responseErrors").innerHTML =  event.message + "<br/>\n<pre>" + event.where + "</pre>";
                    } else {
                        document.getElementById("responseErrors").innerHTML = event.message;
                    }
                }, 
                {escape: true}
            );
        }
    </script>

    <input id="acctSearch" type="text"/>
    <button onclick="getRemoteAccount()">Search</button>
    <div id="responseErrors"></div>


    <div id="dv">
    <table style="float:left;" Id="mytable">
       <thead >
            <tr data-bind="foreach: columnNames" >
                <th> <span data-bind="text: $data"></span>
                </th>
            </tr>
        </thead>

        <tbody data-bind="foreach: items">
            <tr data-bind="foreach: $parent.columnNames">
                <td data-bind="text: $parent[$data]"></td>
            </tr>
        </tbody>
    </table>
    </div>  

</apex:page>

var VM=函数(){
var self=这个;
self.items=ko.observearray();
self.columnNames=ko.computed(函数(){
if(self.items().length==0)
返回[];
var-props=[];
var obj=self.items()[0];
for(obj中的变量名称)
道具推(名称);
返回道具;
});
};
函数getRemoteAccount(){
var cityName=document.getElementById('acctSearch').value;
Visualforce.remoting.Manager.invokeAction(
“{!$RemoteAction.AccountRemoter.getAccount}”,cityName,函数(结果,事件){
如果(事件状态){
var vm=新vm();
ko.应用绑定(vm);
//vm.items.removeAll();
对于(变量i=0;i\n”+event.where+”;
}否则{
document.getElementById(“responseErrors”).innerHTML=event.message;
}
}, 
{escape:true}
);
}
搜寻

尝试
self.items.removeAll()
applyBindings()之前

谢谢你的回复,我试过了,但没有成功:var vm=new vm();vm.items.removeAll();ko.应用绑定(vm);每次单击“查找”按钮时,都必须清除VM对象。