0

我在我的 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 的列表。unit这个方法基本上用看起来像这样的真实对象更新这个列表:

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

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

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

如果我尝试这样做,并改为使用以下回调,我得到的列表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 线程和原始文档,但我有点卡在这一点上。

谢谢!

4

1 回答 1

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得更加用户友好。我发现它非常容易使用。
于 2013-08-05T06:58:01.650 回答