VisualForce Remoting无法使用单独的AngularJS控制器文件

时间:2016-01-05 12:09:11

标签: angularjs salesforce visualforce

我在使用Visualforce远程处理和angularjs时遇到问题。每当我将控制器代码放在单独的js静态资源中时,我的代码就不起作用了。请帮我搞清楚。

我的Visualforce页面

    <apex:page controller="ApexRemoteActionPageController" docType="html-5.0">
<html>
<body>
 <div class="bootstrap" ng-app="ngApp" ng-controller="ContactCtrl" >

 <h1 align="center">Click The Button</h1>
 <button ng-click="getContacts()" class="btn btn-lg btn-default btn-block">Get Contacts</button> 

 <p>
 <ul>
 <li id="{{current.Id}}" ng-repeat="current in contacts" ng-class-even="'rowEven'">{{current.Name}}</li>
 </ul>
 </p>
</div>
<apex:stylesheet value="//cdn.jsdelivr.net/webjars/bootstrap-sf1/0.1.0-beta.6/css/bootstrap-namespaced.css"/>
 <apex:includeScript value="//ajax.googleapis.com/ajax/libs/angularjs/1.3.0-beta.11/angular.min.js"/>
 <apex:includeScript value="{!$Resource.ContactCtrl}" />
</body>
</html>
</apex:page>

我的控制器静态资源

    <script>
var ngApp= angular.module("ngApp", []); 
 ngApp.controller("ContactCtrl", ["$scope", function($scope) 
                                 {
                                  $scope.contacts = [];
                                  $scope.getContacts = function() {
               ApexRemoteActionPageController.myContacts(function(result, event) {
               $scope.contacts = result;
               $scope.$apply();
});
}
}]);
</script>

我的Apex控制器

global class ApexRemoteActionPageController {
@RemoteAction
global static List<Contact> myContacts() 
{
   return [select id, name, email from Contact Order By LastModifiedDate DESC LIMIT 30];
}  

}

每当我将控制器逻辑放在同一个Visual Force页面中时它就可以工作,但是当我将我的控制器脚本移动到单独的js静态资源时,它就不会。

2 个答案:

答案 0 :(得分:0)

您的控制器静态资源是一个Javascript文件,因此不需要<script>个标记。删除这些,我相信您的静态资源将按预期工作。

更多详细信息:如果您在js文件中使用<script>标记,您最终会得到嵌套脚本标记的标记,我认为这不会对您有用。这是因为<includeScript>呈现为HTML标记中的脚本标记。

答案 1 :(得分:0)

我终于找到了答案。是问题的一部分是在静态资源中使用angularFormsModule.factory('efService', return { employee : "Employee Detail Available" }); 标记需要删除,但真正的问题是在放置远程调用时没有在控制器之前放置名称空间前缀。

ApexRemoteActionPageController.myContacts(函数(结果,事件)

需要

namespaceprefix。 ApexRemoteActionPageController.myContacts(函数(结果,事件)

默认情况下,Developer Edition中不会设置命名空间前缀,我们必须导航到开发帐户左侧的搜索栏并搜索创建包...转到包并启用托管包选项。 ..which将为我们提供为我们的整个帐户(classes.controllers ...等)设置命名空间前缀的选项,然后来到javascript静态资源并将您的命名空间放在controller.methodname之前,那就是..