Javascript 从控制器访问获取的资源?

Javascript 从控制器访问获取的资源?,javascript,ajax,angularjs,angularjs-scope,Javascript,Ajax,Angularjs,Angularjs Scope,在我的AngularJS控制器中,我尝试做一些相对简单的事情:我尝试在控制器中动态填充元素。为此,我需要等待加载本地化的UI文本数据和加载来自服务器的数据,这给我带来了一个问题 我的HTML是什么样子的: <select data-ng-model="group" data-ng-options="options.value as options.label for options in userGroups"> <option>--</option> &l

在我的AngularJS控制器中,我尝试做一些相对简单的事情:我尝试在控制器中动态填充
元素。为此,我需要等待加载本地化的UI文本数据和加载来自服务器的数据,这给我带来了一个问题

我的HTML是什么样子的:

<select 
data-ng-model="group"
data-ng-options="options.value as options.label for options in userGroups">
<option>--</option>
</select>
下面是baseController的相关片段:

// baseController.js
$scope.getDataFromUrl = function (url, cache, successFunction) {
    $http.get(url, { cache: cache })
    .success(function (data) {
        if (!handleErrorInData(data))
        {
            successFunction(data);
        }
    });
};

$scope.getDataFromUrl(uiTextResourceUrl, true, function (data) {
    $scope.uiText = data;
});
因此
baseController
在加载时获取文本资源,并在完成数据检索时将其设置为作用域<另一方面,code>exampleController将通过
baseController
中定义的
getDataFromUrl()
函数从服务器获取其他数据,如下所示:

$scope.getDataFromUrl(dataUrl, false, function (data) {
    // Do stuff with the returned data...
};
我的问题来自
exampleController
代码的这一部分,我在其中填充了前面的
元素的数据:

// exampleController.js (Continued...)

$scope.getDataFromUrl(userGroupsUrl, false, function (data) {
    initSelectDropdown(data);
});

var initSelectDropdown = function (data) {
    var userGroups = [];

    // Parse data retrieved from the server and populate the <select> bound data
    // array with it
    var index;
    for (index = 0; index < data.length; ++index)
    {
        var newGroup = {
            value: data[index],
            label: data[index]
        };

        // One of the data entries will have a value of "", this group needs its
        // label to be set to the localized string "No Group"
        if (newGroup.value === "")
        {
            newGroup.label = '<' + $scope.uiText['NoGroup.Text'] + '>';
        }
        userGroups.push(newGroup);
    }

    // Set local userGroups to scope
    $scope.userGroups = userGroups;
};
//exampleController.js(续…)
$scope.getDataFromUrl(userGroupsUrl,false,函数(数据){
初始化选择下拉列表(数据);
});
var initSelectDropdown=函数(数据){
var userGroups=[];
//解析从服务器检索的数据并填充绑定的数据
//阵列
var指数;
对于(索引=0;索引
我遇到的问题在
initSelectDropdown()函数中。我需要有来自服务器的数据和来自服务器的uiText资源数据,特别是行
newGroup.label=''其中数据的转换方式取决于加载的本地化资源。我研究了这个问题,发现使用
$q.all()
可能是一个解决方案,但不幸的是,在我的情况下,我无法调用
$q.all()
,因为两个获取数据的调用是从不同控制器中的不同函数进行的(从子控制器请求数据,从基本控制器请求资源)

在视图中,很容易解决这个问题,因为如果我将一个元素绑定到
$scope.uiText['SomeText.Text']
,那么它就不在乎
SomeText.Text
一开始是否未定义,当它最终被填充时,UI将自动接收更改


我如何才能做到这一点?是否有可能实现视图中绑定的工作方式?

对于共享代码/服务/工厂,您不需要使用基本控制器

定义一个工厂类并添加两个方法,一个用于获取服务器数据,另一个用于获取uiText数据。这些方法将返回承诺

现在在控制器中,您可以使用$q.all()传递两个承诺,这两个承诺将在ajax调用完成时得到解决。
希望它有意义?

对于共享服务/工厂代码,您不需要使用基本控制器

定义一个工厂类并添加两个方法,一个用于获取服务器数据,另一个用于获取uiText数据。这些方法将返回承诺

现在在控制器中,您可以使用$q.all()传递两个承诺,这两个承诺将在ajax调用完成时得到解决。
希望它有意义?

对于共享服务/工厂代码,您不需要使用基本控制器

定义一个工厂类并添加两个方法,一个用于获取服务器数据,另一个用于获取uiText数据。这些方法将返回承诺

现在在控制器中,您可以使用$q.all()传递两个承诺,这两个承诺将在ajax调用完成时得到解决。
希望它有意义?

对于共享服务/工厂代码,您不需要使用基本控制器

定义一个工厂类并添加两个方法,一个用于获取服务器数据,另一个用于获取uiText数据。这些方法将返回承诺

现在在控制器中,您可以使用$q.all()传递两个承诺,这两个承诺将在ajax调用完成时得到解决。
希望它有意义?

我们使用的是基本控制器而不是服务,因为我们不想复制和粘贴错误处理函数
handleErrorInData()
,以及所有控制器之间共享的其他公共功能。根据您的建议,我们必须在每个控制器中调用
$myService.fetchUiText()
,并在每个控制器中定义错误处理函数(最终将错误消息写入$scope,这就是为什么该逻辑不能进入服务中的原因)您必须在工厂/服务中定义handleError函数,并将该工厂/服务注入到需要它的控制器中。@a请注意,但在服务中定义handleError似乎是一种不好的做法,因为如果遇到错误,handleError最终会将$scope.error设置为某些消息。以及“角度方式”建议只有控制器才能修改作用域。您尚未共享handleError的实现,但是否无法以这样的方式编写它:一旦出错,它将返回错误,然后您可以使用它从控制器在作用域中进行设置?这样,作用域将仅在控制器中修改,并且您还可以重用方法
handleError()
是一大块代码,根据错误执行不同的操作,包括不只是设置错误消息,例如将用户重定向到其他屏幕。我们使用的是基本控制器而不是服务,因为我们不想复制和粘贴错误处理功能
handleErrorInData()
跨越每个控制器,
// exampleController.js (Continued...)

$scope.getDataFromUrl(userGroupsUrl, false, function (data) {
    initSelectDropdown(data);
});

var initSelectDropdown = function (data) {
    var userGroups = [];

    // Parse data retrieved from the server and populate the <select> bound data
    // array with it
    var index;
    for (index = 0; index < data.length; ++index)
    {
        var newGroup = {
            value: data[index],
            label: data[index]
        };

        // One of the data entries will have a value of "", this group needs its
        // label to be set to the localized string "No Group"
        if (newGroup.value === "")
        {
            newGroup.label = '<' + $scope.uiText['NoGroup.Text'] + '>';
        }
        userGroups.push(newGroup);
    }

    // Set local userGroups to scope
    $scope.userGroups = userGroups;
};