angularjs中的$ resource回调函数

时间:2013-08-05 05:52:22

标签: angularjs angularjs-resource

我在html中设置了一个由ng-click事件调用的方法:

<div ng-repeat="section in model.sections">
    <a ng-click="updateSection($index)">
</div>

然后在我的javascript文件中,我有以下服务:

.factory('Sections', function($resource){
    return{
        onUnits: $resource('/api/sections/:uuid/units', {uuid:'@sectionUUID'}, {
            get: {method: 'GET', params:{uuid: '@uuid'}, isArray:true}
        }
    }
}

从html调用的方法是:

$scope.updateSection = function(index){
    $scope.model.sections[index].sectionUnits = Sections.onUnits.get({uuid: $scope.model.sections[index].sectionUUID}
        ,console.log($scope.model.sections[index])
        );
    }
在此更新发生之前

$scope.model.sections[0].sectionUnits == ['d1','d2']

这是与此部分关联的单位的ID列表。此方法基本上使用看起来像{/ p>的真实unit对象更新此列表

.sectionUnits = [{unitUUID: 'd1',
                  materials: ['m1','m2','m3']
                  }, {... }]

在我的浏览器中,上面的代码返回我正在寻找的更新的section对象,所有unit个对象都嵌套在section下。

然而,我真正想要的是实现一个回调,该回调获取与此更新的materials对象中的单元关联的所有section的id列表,并检索它们。

如果我尝试了这一点,并进行了以下回调,我会得到sectionUnits的列表,但仍然只是ID:

$scope.updateSection = function(index){
    $scope.model.sections[index].sectionUnits = Sections.onUnits.get({uuid: $scope.model.sections[index].sectionUUID}
        ,console.log($scope.model.sections[index].sectionUnits)
        );
    }

我已经浏览了很多SO主题和原始文档,但此时我已经陷入困境。

谢谢!

1 个答案:

答案 0 :(得分:1)

我遇到的模式最多的是创建资源对象,然后在回调中进行分配。因此,您将拥有:

,而不是当前的updateSections函数
$scope.updateSection = function(index) {
    Sections.onUnits.get(
        {uuid: $scope.model.sections[index].sectionUUID},
        function(results) {$scope.model.sections[index].sectionUnits = results}
    )
}

我认为在你的代码中GET的结果实际上并没有被分配,这就是为什么你要回到原来的id数组。

请注意,分配仅在资源的成功GET上发生。你应该有一个单独的回调来处理任何错误。

另外请记住,服务是单身,所以如果你传递它,请注意不要改变Sections,否则它会改变其他地方。

如果您想链接请求,以便在检索到某个部分之后获得材料,那么您将在分配后立即在回调中执行此操作。:

$scope.updateSection = function(index) {
    Sections.onUnits.get(
        {uuid: $scope.model.sections[index].sectionUUID},
        function(results) {
            $scope.model.sections[index].sectionUnits = results;
            // Should contain some looping mechanism since results is an array.
            $scope.getMaterials(results);
        }
    )
}

关于您的代码的其他几点说明:

  • 获取资源的初始方法调用似乎有些不对劲。此时,您说sectionUnits对象是一个字符串数组,但您的updateSection()方法调用尝试将该数组作为对象引用。你说你可以得到一个控制台打印输出,所以我猜它是有效的,但你只是打错了
  • 将sectionUnits对象从字符串数组变为数组对象似乎是一个坏主意。也许将其初始化为.sectionUnits = [{unitUUID:'d1'}, {unitUUID:'d2'}]
  • 您可能需要查看Restangular,它基本上将$resource包裹起来,以方便用户使用。我发现它很容易使用。