如何在Angular JS中将$ rootScope变量从Controller传递给Service

时间:2015-09-07 11:50:14

标签: javascript jquery angularjs rest sharepoint

请在下面找到我的代码示例。

模型中的代码(HTML代码)



<select ng-model="drpDown1" ng-options="option.Title as option.Title for option in drpDown1Options">
       <option value="">Select a value..</option>
</select> 
<br/>

<select ng-model="drpDown1" ng-options="option.Title as option.Title for option in drpDown2Options">
       <option value="">Select a value..</option>
</select>
&#13;
&#13;
&#13;

对于上述dropDown的绑定值,我在SharePoint 2013 App模型中使用REST api

此外,我有很多这样的下拉菜单。我必须为每个下拉列表使用相同的代码,除了listname中的更改,用于绑定值的变量。

所以我想使用服务并将以下代码放在名为 myService.js

的服务中

我正在使用以下代码。

&#13;
&#13;
  this.bindDropdown = function (listname,dropDownOptionsVar,$rootScope)        {
        debugger;
        var arr = [];
        var listName = listname;
        var scriptbase = hostweburl + "/_layouts/15/";
        var requestUrl = appweburl + "/_api/SP.AppContextSite(@target)/Web/Lists/getbytitle('" + listName + "')/items?&@target='" + hostweburl + "'";
        var executor = new SP.RequestExecutor(appweburl);
        executor.executeAsync({
            url: requestUrl,
            method: "GET",
            headers: { "Accept": "application/json;odata=verbose" },
            success: function (data) {
                var responseData = JSON.parse(data.body);
                for (var i = 0; i < responseData.d.results.length; i++) {
                    var Title = responseData.d.results[i].Title;
                    var Id = responseData.d.results[i].Id;
                    arr1.push({
                        ID: Id,
                        Title: Title
                    });
                }
                $rootScope.dropDownOptionsVar = arr;
                $scope.$apply();
            },
            error: function (data, errorCode, errorMessage) {
                alert(errorMessage);
            }
        });

    }
&#13;
&#13;
&#13;

我在 myController.js 上面调用 myServicve.js 的功能,如下所示。

myController.js代码

&#13;
&#13;
$rootScope.drpDown1Options ='';
$rootScope.drpDown2Options = '';

mySerivce.bindDropdown("List1",$rootScope.drpDown1Options,$rootScope);
mySerivce.bindDropdown("List2",$rootScope.drpDown2Options,$rootScope);
   
&#13;
&#13;
&#13;

所以这里的问题是它工作不正常..参数 $ rootScope.drpDown1Options 没有传递给 mySerivce.js

中的函数

只有在我更改以下声明

时才能正常工作

$ rootScope.dropDownOptionsVar = arr;

$ rootScope.drpDown1Options = arr;
单个函数中的$ rootScope.drpDown2Options = arr;
(通过创建一个函数来绑定一个 dropdwon)

2 个答案:

答案 0 :(得分:0)

创建全局变量

如果您希望使用$rootScope来存储您的值,您应该在app.js中创建一个运行函数,您可以在其中实例化所有这些函数以在整个应用程序中使用。

下面的代码段
.run(function ($rootScope) {
  $rootScope.variableOne= -1;
  $rootScope.variableTwo= 5;
  $rootScope.variableThree= 50;
}) 

将此放在您的行下angular.module('star...&#39;

最佳实践

您应该始终使用工厂或服务在控制器之间传递数据,而不是使用全局变量。您可以为数据创建getter和setter,这是getter和setter的基本示例(免责声明:代码尚未由我运行)。

.factory('yourFactory', function () {
  var someValue = {};
  return {
    get: function () {
        return someValue;
    },
    set: function(value){
      someValue = value;
    }
  };
})

然后,您可以在需要时实例化此服务并从中获取数据。您还可以添加更多详细信息,例如添加int以从存储的列表或数组中获取特定值。

答案 1 :(得分:0)

我认为你应该在将响应值声明为数组后直接将其推送到参数数组(请参阅https://stackoverflow.com/a/6605700/1358376以获取javascript中的参数)

// in controller
$rootScope.drpDown1Options = [];
mySerivce.bindDropdown("List1",$rootScope.drpDown1Options);


// in service
this.bindDropdown = function (listname,dropDownOptionsVar)              
{
    ...
        success: function (data) {
            var responseData = JSON.parse(data.body);
            for (var i = 0; i < responseData.d.results.length; i++) {
                var Title = responseData.d.results[i].Title;
                var Id = responseData.d.results[i].Id;
                dropDownOptionsVar.push({
                    ID: Id,
                    Title: Title
                });
            }
            $scope.$apply();
        },...
    });

}

(顺便说一下,你正在推进一个阵列&#39; arr1&#39;但是宣布/分配&#39; arr&#39; - 这永远不会有效)

但我也更喜欢服务而不是rootScope变量