【问题标题】:Mean.js Stack - export.read with findOne and find functions, call in AngularjsMean.js Stack - export.read 与 findOne 和 find 函数,在 Angularjs 中调用
【发布时间】:2015-09-19 10:42:21
【问题描述】:

我是 MEAN.js 的新手,我对如何使用 export.read 和调用添加了 find 函数的 findOne 函数有点困惑。我有一个 customers 模块和一个 customer-users 模块我的应用程序。我有customers.server.controller、customer-users.server.controller 和客户端控制器。客户就像一个组织。还有一些用户属于客户。我可以使用 customer-users 模块中的 export.list 单独显示客户用户列表。我可以在customers 模块中显示客户列表,然后当您选择客户时,我当然有客户视图。我想要做的是,当您选择客户时,客户用户列表将显示在客户视图的客户名称下方。我已尝试编辑 customers.server 和 customers.client 控制器以完成此操作,但我不确定执行此操作的正确方法。

这是我的customers.server.controller.js

'use strict';
/**
* Module dependencies.
*/
var mongoose = require('mongoose'),
errorHandler = require('./errors.server.controller'),
Customer = mongoose.model('Customer'),
passport = require('passport'),
User = mongoose.model('User'),
CustomerUser = mongoose.model('CustomerUser'),
_ = require('lodash');

/**
* Show the current Customer
*/
exports.read = function(req, res) {
    Customer.findOne({ _id: req.params.customerId }).exec(function(err, customer) {
        if (err) {
            return res.status(400).send({
                message: errorHandler.getErrorMessage(err)
            });
        } else {
            CustomerUser.find({ customer: req.customer }).sort('-created').exec(function(err, customerUsers) {
                if (err) {
                    console.log('error');
                    return res.status(400).send({
                        message: errorHandler.getErrorMessage(err)
                    });
                } else {
                    var customerUsersList = customerUsers;
                    var selectedCustomer = customer;
                    var customerWithUsers = {
                        customer: selectedCustomer,
                        customerUsers: customerUsersList
                    };
                    console.log('1 : ' + customerUsersList);
                    console.log('2 : ' + selectedCustomer);
                    console.log('3 : ' + customerWithUsers);
                    res.jsonp(customerWithUsers);
                }
            });
        }
    });
};

我一直在尝试使用所有 console.log 调用来调试所有代码,一切似乎都给了我正在寻找的正确数组。所以我觉得这应该在服务器端工作。

我的customers.client.controller.js(到目前为止;这是我对如何正确执行此操作感到困惑的地方):

use strict';

// Customers controller
angular.module('customers').controller('CustomersController', ['$scope', '$stateParams', '$location', 'Authentication', 'Customers', 'AdminCustomerUsers', 'CustomerUsers',
function($scope, $stateParams, $location, Authentication, Customers, AdminCustomerUsers, CustomerUsers) {
    $scope.authentication = Authentication;
    $scope.customerId = $stateParams.customerId;

    $scope.findOne = function() {
        $scope.customer = Customers.get({
            customerId: $stateParams.customerId
        });

        $scope.customerUsers = Customers.query({
            customer: $scope.customer
        });
        console.log($scope.customer);
        console.log($scope.customer.customerUsers);
        console.log($scope.customerUsers);
    };

我尝试了许多不同的东西,所以这不是我所拥有的范围,但这是我为个人客户调用 findOne 的基础。

我的view-customers.client.view.html(当然必须根据可行的解决方案进行修改):

 <section data-ng-controller="CustomersController" data-ng-init="findOne()">
    <div class="page-header">
        <h1 data-ng-bind="customer.name"></h1>
    </div>

    <div class="pull-right" data-ng-show="((authentication.user) && (authentication.user._id == customer.user._id))">
        <a class="btn btn-primary" href="/#!/customers/{{customer._id}}/edit">
            <i class="glyphicon glyphicon-edit"></i>
        </a>
        <a class="btn btn-primary" href="/#!/customer-users/{{customer._id}}/create">
            <i class="glyphicon glyphicon-user"></i>
            <i class="glyphicon glyphicon-plus"></i>
        </a>
        <!-- <a class="btn btn-default btn-danger" data-ng-click="remove();">
            <i class="glyphicon glyphicon-trash"></i>
        </a> -->
    </div>
    <small>
        <em class="text-muted">
            Added on
            <span data-ng-bind="customer.created | date:'mediumDate'"></span>
            by
            <span data-ng-bind="customer.user.displayName"></span>
        </em>
    </small>

    <br /><br /><br />
    <div class="list-group">
        <div data-ng-repeat="customerUser in customerUsers" class="list-group-item">
            <h4 class="list-group-item-heading">
                {{customerUser.user.displayName}}
                hello
                <small class="label label-default" ng-show="customerUser.admin">admin</small>
            </h4>
        </div>
    </div>
</section>

所以我的问题是如何在客户视图下获取客户用户列表?我对这一切都错了吗?有没有更好的办法?就像我说的,一切似乎都在服务器端工作,但我不能在客户端调用填充了正确对象的 customerUsers 数组。有没有办法在客户控制器旁边的视图中使用客户用户控制器,这样我就可以使用客户用户控制器来实现这一点?因为我也尝试过这样做,但惨遭失败。我可能只是错过了这里的逻辑。提前感谢您的帮助。

【问题讨论】:

    标签: javascript angularjs node.js jsonp meanjs


    【解决方案1】:

    是否有代码从客户端调用服务器(node.js / customers.server.controller.js)?

    由于该调用将是异步的,因此 Customers.get() 和 Customers.query() 函数应该返回承诺。 Angular 不会自动打开它们。

    这样的事情应该可以工作:

    Customers
        .get({
            customerId: $stateParams.customerId
        })
        .then(function(customer){
            $scope.customer = customer;
        });
    

    【讨论】:

    • 我不确定你的问题是什么意思。是的,他们确实返回了承诺。但是您发布的代码不起作用。它说Customers.get(...).then is not a function 我在.then 函数之前添加了$promise,但不是说$scope.customer 未定义。
    • 如果他们返回承诺,.then() 将是一个函数(根据承诺规范)。至于第一个问题......您发布的代码似乎存在差距。您的第一个代码块在 node.js 中运行,它是一个 服务器。您的第二个代码是 angular.js,它在客户端上运行。为了让客户端调用服务器,我希望看到一些 ajax 调用。 那个代码在哪里?包含ajax调用的代码?有没有实现这一点的角度服务?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-01
    • 2022-01-23
    • 2018-06-09
    相关资源
    最近更新 更多