2015-12-27 30 views
0

我重写了部分代码,使其更易于理解,因此请耐心等待代码的完整,我只写了导致问题的部分。如何使用刚刚在当前视图中呈现的参数值调用角度控制器函数?

我有一个mean.js应用程序,后端使用express和mongodb排序,我的所有资源端点都独立运行,但现在我正在查看具有复杂模式的对象,因此可以说objA具有值ObjectId for objB

每当我尝试从ObjA视图中通过Id来检索ObjB时,我调用getObjectBbyID的$资源工厂,但我无法在当前的$ scope中找到可用于存储的值只是通过NG-绑定在ObjA HTML视图呈现的值

猫鼬模型

var objASchema = new Schema({ 
name:{ 
type: string 
}, 
myobjB:{ 
type: Schema.ObjectId, 
ref: 'ObjectB' 
} 
)}; 
mongoose.model('ObjectA', objASchema); 

在我的角度前端有一个$资源工厂,通过标识

终于得到$资源
angular.module('objbmodule').factory('ObjectBs', ['$resource', 
    function($resource){ 
      return $resource('api/objbs/:objbId',{ 
       objbId: '@_id' 
      }, { 
      update:{ 
       method: 'PUT' 
      } 
     }); 
}]); 

在我看来,我试图检索对象B的标识,对象A findOne的视图中()

angular.module('objas').controller('ObjAController', ['$scope',$routeParams','ObjectBs' function($scope, $routeparams, ObjectBs){ 
$scope.findOne=function(){ 
$scope.obja= ObjectAs.get({ 
objaId: $routeParams.objaId 
}); 
}; 

$scope.findObjB=function(someid){ 
if(!someid) 
console.log("noid"); 
$scope.objb = ObjectBs.get({ 
objbId: someid 
}); 
}; 
} 
]); 

现在的问题就出在这里,在这一个观点我需要调用2工厂GET方法,第一个使用从我的申请途径的观点在原来的$ routeParam提供的ID,第二个使用objbId当检索到第一个ObjA时呈现的值。

<div ng-controller="ObjAController" ng-init"findOne()"> 
<span ng-bind="obja.name">{{obja.name}}</span> 
<span ng-bind="obja.objbId">{{obja.objbId}} 
<span ng-init="findObjB(obja.objbId)" ng-bind="objb.name"> 
</div> 

我无法找到一个可能的NG指令,可以使用刚刚呈现在该视图的ID值勾起我的控制器的方法,因为它只是在渲染HTML存在,

+0

我不确定这里的问题是否完全清楚。如果通过“Id值”来表示'obja.objId',那就是'$ scope.obja.objbId'。 '$ scope'隐含在HTML中,但这些值仍然绝对存在于JS中,而不仅仅是在呈现的HTML中。另外,严格来说,这并不适用于'ng-init'。 – Claies

+0

Object a为Object b _id值保存一个值,我试图在前端角控制器中使用或保存某个值,以便与Object B工厂一起使用它通过使用get工厂的Id检索对象B. 我使用ng-init作为唯一的方式,我确信会调用我的控制器中的第二个函数,负责获取Object B文档,而无需任何用户输入。 –

回答

0

你可以让你findOne功能使用$ q返回以下承诺:

function findOne() { 
    var config = {method: "get", url: prefix + "get", params: {id: id}}; 
    var deferred = $q.defer(); 
      deferred.resolve(ObjectAs.get({objaId: $routeParams.objaId})); 
    return deferred.promise; 
}; 

,然后你可以叫你的NG-init,可以使用该承诺执行您需要执行的下一个功能的getOne功能:

function getOne() { 
    findOne() 
     .then(function(response) { 
      secondaryFunction1(); 
      secondaryFunction2(); 
     }); 
}; 
0

原来这很容易解决,但从猫鼬的角度来看,从数​​据库中检索正确的对象,然后从角度绑定到前端的正确值。

在我的猫鼬服务器控制器

var mongoose = require('mongoose'), 
ObjectA = mongoose.model(ObjectA); 

exports.objectAById = function(req, res, next, id){ 
//here i WAS populating('_id', 'objb') instead of what I have now which returns the whole objb Object wrapped inside the ObjectA JSON 
ObjectA.findById(id).populate('objb') 
.populate('name) 
.exec(function(err, obja){ 
//error handling 
在我的HTML

现在我有

<span ng-bind="obja.objb.name"></span> 

它主要是关于需要的调整我的后端findone方法。感谢您的贡献

相关问题