【问题标题】:Sails JS - How to Work With Specific Model Attributes from the Associated ControllerSails JS - 如何使用关联控制器中的特定模型属性
【发布时间】:2015-06-04 14:02:10
【问题描述】:

我正在学习 Javascript、Node 和 Sails,并且有一个基本的新手(我认为)问题,我在其他地方找不到答案。

在控制器中,我试图访问特定的模型属性,然后创建一个数组,其中包含每个单独的条目以在视图中使用。虽然我可以在菜单/索引视图中访问模型中的记录,但我似乎无法直接在模型中使用任何特定属性。

这是有问题的控制器代码:

var MenuController = module.exports = {

manager: function(req, res) {
var userId = req.session.user.id;

sails.log("Searching for foods for user: "+ userId);
Menu.find({ where: { userId: { equals: userId }}}).exec(function(err, records) {
    if(records && records.length == 0) {
      sails.log("No foods found for user: " + userId);
      sails.log(err);
      return res.view("menu/index");
    } else {
          var foodCategories = records.food_category;
          sails.log(foodCategories);
          var array = foodCategories.split(',');
          var foodCatArray = [];
          for (i = 0; i < array.length; i++) {
            foodCatArray.push(array[i].toUpperCase());
            var uniqueCats = foodCatArray.filter(function (item, i, ar) {
              return ar.indexOf(item) === i;
            });
            var sortedCats = uniqueCats.sort();
            sails.log(sortedCats);
          }
          return res.view("menu/index", {foods: records, sortedCats: sortedCats});
        }
      });
},

这是有问题的模型:

var Menu =  module.exports = {
attributes: {
userId: {
  required: true,
  type: 'integer',
  min: 1
},
food_category: {
  type: "string",
  required: false,
  min: 1,
  max: 200
},
food_name: {
  type: "string",
  required: true,
  min: 1,
  max: 200
},
food_cost: {
  type: "string",
  required: true,
  min: 1,
  max: 10
},
food_description: {
  type: "string",
  required: true
},
img_path: {
  type: "string",
  required: true
},
img_name: {
  type: "string",
  required: true
},
img_name_crypt: {
  type: "string",
  required: true
}
}
};

现在这一行:

var foodCategories = records.food_category; 

当我加载菜单/索引视图时,在我的 Sails 日志中创建一个未定义的值。有人能指出我正确的方向吗?

【问题讨论】:

    标签: javascript node.js model controller sails.js


    【解决方案1】:

    您的记录变量很可能是对象数组。

    将代码移到 for 循环中,并像使用它一样使用它

    records[i].food_category
    

    你不需要 var 数组... 在 for 循环中使用 records.lenght 代替

    【讨论】:

    • 感谢摩尔达!我会试一试。
    • 这让我足够了解这一点。在添加了你建议的那个位之后,我最终重写了很多可怕的 Javascript,并且能够像我希望的那样获得我的数组输出。我将发布我的最终控制器 javascript。
    【解决方案2】:

    非常感谢 Molda 轻轻推动我朝着正确的方向前进!

    这是最终为我工作的 Sails 控制器代码:

    var MenuController = module.exports = {
    
    manager: function(req, res) {
      var userId = req.session.user.id;
      sails.log("Searching for foods for user: "+ userId);
      Menu.find({ where: { userId: { equals: userId }}}).exec(function(err, records) {
       if(records && records.length == 0) {
        sails.log("No foods found for user: " + userId);
        sails.log(err);
        return res.view("menu/index");
       } else {
        var foodCatArray = [];
          for (i = 0; i < records.length; i++) {
            var foodCategories = records[i].food_category;
            foodCatArray.push(foodCategories);
          }
        var uniqueCats = foodCatArray.filter(function (item, i, ar) {
          return ar.indexOf(item) === i;
        });
        uniqueCats.sort();
        sails.log(uniqueCats);
        sails.log("Returning " + records.length + " foods found for user: " + userId);
        return res.view("menu/index",{ foods: records, foodCats:uniqueCats });
      }
     });
    },
    

    此代码循环遍历用户菜单条目中每个食物项的每个 food_category 字符串,将其添加到数组中,然后对数组进行排序,消除重复项并按字母顺序对数组进行排序。在我看来,我可以使用“foodCats”来获取这个数组并对其进行任何我需要的操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多