【问题标题】:how to call an angular controller function using a parameter value that is just rendered in the current view?如何使用刚刚在当前视图中呈现的参数值调用角度控制器函数?
【发布时间】:2016-06-08 00:38:36
【问题描述】:

我重写了部分代码以使其更易于理解,因此请耐心阅读代码,我只编写导致问题的部分。

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

每当我尝试从 ObjA 视图中按 Id 检索 ObjB 时,我都会调用 $resource 工厂以获取 getObjectBbyID,但我在当前 $scope 中找不到可用于存储刚刚呈现的值的值通过 ObjA html 视图中的 ng-bind

猫鼬模型

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

在我的 Angular 前端有一个 $resource 工厂,它通过 Id 获取 $resource

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

最后在我看来,我试图在 ObjectA findOne() 的视图中按 Id 检索 objectB

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 中,

【问题讨论】:

  • 我不确定这里的问题是否完全清楚。如果您所说的“Id 值”是指obja.objId,那么就是$scope.obja.objbId$scope 隐含在 HTML 中,但这些值仍然绝对存在于 JS 中,而不仅仅是在呈现的 HTML 中。此外,严格来说,这不是ng-init 的适当用法。
  • 对象 a 保存对象 b _id 值的值,我试图在前端角度控制器中使用或保存该值,以便将其与对象 B 工厂一起使用,以使用 Id 检索对象 B拿到工厂。我使用 ng-init 作为唯一方法,我确信会在我的控制器中调用负责获取对象 B 文档的第二个函数,而无需任何用户输入。

标签: angularjs node.js mongodb mongoose


【解决方案1】:

您可以使用 $q 使您的 findOne 函数返回一个承诺,如下所示:

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();
        });
};

【讨论】:

    【解决方案2】:

    事实证明这很容易解决,但从 mongoose 的角度来看,要从数据库中检索正确的对象,然后从 angular 到前端绑定到正确的值。

    在我的猫鼬服务器控制器中

    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 方法。感谢您的贡献

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-28
      相关资源
      最近更新 更多