请在下面找到我的代码示例。
模型中的代码(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;
对于上述dropDown的绑定值,我在SharePoint 2013 App模型中使用REST api
此外,我有很多这样的下拉菜单。我必须为每个下拉列表使用相同的代码,除了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);
}
});
}
&#13;
我在 myController.js 上面调用 myServicve.js 的功能,如下所示。
myController.js代码
$rootScope.drpDown1Options ='';
$rootScope.drpDown2Options = '';
mySerivce.bindDropdown("List1",$rootScope.drpDown1Options,$rootScope);
mySerivce.bindDropdown("List2",$rootScope.drpDown2Options,$rootScope);
&#13;
所以这里的问题是它工作不正常..参数 $ rootScope.drpDown1Options 没有传递给 mySerivce.js
中的函数只有在我更改以下声明
时才能正常工作$ rootScope.dropDownOptionsVar = arr;
到
$ rootScope.drpDown1Options = arr;
单个函数中的$ rootScope.drpDown2Options = arr; (通过创建一个函数来绑定一个 dropdwon)
答案 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变量