2015-09-07 77 views
0

請在下面找到我的代碼示例。

守則模型(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>

對於

,並結合值在SharePoint 2013應用程序模型,我使用REST API上面的下拉列表中,我有很多這樣的dropdowns ..我必須使用相同的代碼爲每個下拉列表,除了會有一個更改listname,用於綁定值的變量。

所以我想用一個服務,並放置在下面的代碼中一種名爲myService.js

我使用下面的代碼。

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); 
 
      } 
 
     }); 
 

 
    }

我打電話以上的myServicve.jsmyController.js功能如下。

myController.js代碼

$rootScope.drpDown1Options =''; 
 
$rootScope.drpDown2Options = ''; 
 

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

所以這裏的問題是它不工作的罰款。該參數$ rootScope.drpDown1Options沒有傳遞給函數在mySerivce.js

其工作正常只有當我更改以下語句時

$ rootScope.dropDownOptionsVar = arr;

$ rootScope.drpDown1Options = ARR;
$ rootScope.drpDown2Options = arr;
分別在各個功能(通過綁定一個 dropdwon創建一個功能)

+1

無厘頭被污染'在任何這$ rootScope'第一名。爲什麼數據不存儲在服務中? – charlietfl

+0

'$ rootScope'是一個全局變量,應該避免。按照Charlietfl的說法,使用服務來存儲要在控制器之間移動的數據。 –

回答

0

創建全局變量

如果您希望使用$rootScope來存儲你的價值觀,你應該建立在應用程序運行的功能.js,您可以在其中實例化所有這些應用程序,以便在您的應用程序中使用。下面的代碼片段你行「angular.module('star...

最佳實踐

而不是使用全局變量,你應該總是使用工廠或服務控制器之間的數據傳遞的下

.run(function ($rootScope) { 
    $rootScope.variableOne= -1; 
    $rootScope.variableTwo= 5; 
    $rootScope.variableThree= 50; 
}) 

把這個。你爲你的數據創建getter和setter,這裏是一個getter和setter的基本例子(聲明:代碼沒有被我運行過)。

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

然後,您可以在需要時實例化此服務並從中獲取數據。您還可以添加更多詳細信息,如添加int以從存儲列表或數組中獲取特定值。

+0

你不能在工廠注入'$ scope'。此解決方案不起作用 – charlietfl

+0

你是完全正確的。讓我看看如何解決這個問題。 –

+0

在這裏修改了我的代碼,這應該給你一個如何在angularjs中創建getter和setter的想法。這只是非常基本的,但你甚至可以使用服務來操縱它更多 –

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(); 
     },... 
    }); 

} 

(順便說一句,你推到一個數組「ARR1」但申報/指定「的常用3」 - 這絕不會工作)

但我也希望能有一個服務,而不是rootScope變量

+0

上述方法僅在Service中,即使我使用臨時數組也沒有任何區別,因爲我要將值綁定到變量已在Controller中聲明。 我想每個這樣的變量傳遞給服務中的一個公共函數,每次我要將值綁定到下拉列表 –

+0

我編輯了我的答案 - 嘗試將選項變量聲明爲數組而不是字符串 – Rob

相關問題