AngularJs - 未调用API控制器

时间:2013-03-19 21:25:19

标签: angularjs

我的API资源很好,我可以获得所有类并填充任何内容,但出于演示目的,这里是与EngineMakes相关的API资源:

            // EngineMake
            GetEngineMakes: { method: 'GET', params: { controller: 'EngineMakes' }, isArray: true },
            GetEngineMake: { method: 'GET', params: { controller: 'EngineMakes' } },
            AddEngineMake: { method: 'POST', params: { controller: 'EngineMakes' } },
            UpdateEngineMake: { method: 'PUT', params: { controller: 'EngineMakes' } },
            DeleteEngineMake: { method: 'DELETE', params: { controller: 'EngineMakes' } },

我有一个模态表单,允许用户(1)选择引擎制作,然后(2)添加新的引擎模型。我可以将新的引擎模型推向范围,但它与相应的引擎制造无关。

这是我的代码:

// in engine model controller:

$scope.save = function(data) {
    var engineModel = angular.copy($scope.engineModel);
    $http.post('/api/EngineModels/', engineModel)
        .success(function () {
            $rootScope.addEngineModel(engineModel);
        })
        .error(function(data) {
            alert(data);
        });
};

// in engine make controller
$rootScope.addEngineModel = function (engineModel) {

the problem --->   $scope.engineMake = API.GetEngineMake({ id: engineModel.FK_EngineMakeId});      

    $scope.engineMake.EngineModels = $scope.engineMake.EngineModels || [];
    $scope.engineMake.EngineModels.push(engineModel);
};
  1. 新引擎模型已成功添加到数据库并放入范围。

  2. $ rootScope.addEngineModel确实被点击,参数正确且FK_EngineMakeID正确。**

  3. 但是,我对API的调用显然是不正确的,因为我从未点击API控制器来查找与引擎模型FK_EngineMakeID 匹配的EngineMake,因此我可以将新引擎模型推送到相应的EngineMake.EngineModels ,所以当模态关闭并且用户选择引擎make时,新创建的引擎模型是该集合的一部分。

    有谁知道我哪里出错了?

    PS:我对一个简单的$ http.Get感到满意,如果有人能告诉我如何,我会放弃API资源

1 个答案:

答案 0 :(得分:0)

我解决了它,然后是一些 - 注意第一部分和第二部分,我将解释:

第一部分:

$rootScope.addEngineModel = function (engineModel) {
    var tmp = $http({ method: 'GET', url: '/api/EngineMakes/' + engineModel.FK_EngineMakeId }).
              success(function (data, status, headers, config) {
                  $scope.engineMake = angular.copy(data);
                  $scope.engineMakes.push($scope.engineMake);
              }).
              error(function (data, status, headers, config) {
                  console.log('fail');
              });

    $scope.engineMake.EngineModels = $scope.engineMake.EngineModels || [];
    $scope.engineMake.EngineModels.push(engineModel);

第二部分

    var tmp2 = function () {
        API.UpdateEngineMake({ id: $scope.engineMake.Id }, $scope.engineMake, function (res) {
            if (res.Id > 0) {
                alert('success');
            }
        });
    };
};

第一部分将使用选定的EngineMake更新对EngineMake和EngineModel的推送,并在模态因提交结束后预先选择新创建的EngineModel(添加新的EngineModel)。

但是,如果用户出于某些奇怪的原因,在选择主窗体(而不是模态)中重新选择新的EngineMake,然后重新选择之前选择的EngineMake会怎么样?

答案:他失去了新创建的EngineModel的范围,除非他刷新页面。     这是为什么?因为没有II,我无法更新EngineMake与EngineModel的关系。

你需要第二部分才能克服这一不幸事件。

最后一点:

即使使用第二步,选择中也会有两个相同的EngineMakes,一个将拥有新创建的EngineModel,一个不会,所以您需要做的就是这样(即过滤器):

     <select id="engineMake" ng-model="engineMake" ng-options="engineMake.Name for engineMake in engineMakes | unique">
      <option value="" selected>Select Engine Manufacturer ..</option>  
     </select>

Oy公司!我认为现在是加薪的时候了!