【问题标题】:Javascript Assign New Field to objectJavascript将新字段分配给对象
【发布时间】:2015-11-05 16:46:07
【问题描述】:

我在节点应用程序中运行了一段 sn-p 代码

for( i=0; i < Equipment.length; i += 1 ) {
    Equipment[i].NumberForSearch = Equipment[i].ClassPrefix + "-" + Equipment[i].UnitNumber;
    console.log(Equipment[i].NumberForSearch);
}

console.log(Equipment[0]);

设备是一个对象数组,我正在尝试为该数组中的每个对象添加一个名为“NumberForSearch”的属性。

在我的应用程序中,我们希望显示设备单元编号的方式是“ClasssPrefix”-“UnitNumber”。我想在这里将它们加入一个变量的原因是,在我的 Angular 应用程序中,我希望用户能够在搜索字段中键入 12345-12345,然后过滤掉设备。如果我有 {{ClassPrefix}}-{{UnitNumber}} 出于明显的原因,这不起作用,角度不知道 - 甚至存在。

问题在于,在我的 for 循环中,一切正常。它的日志记录就像它应该做的那样,所以我认为它有效。当我检查前端并将其更改为显示“NumberForSearch”时,什么也没有出现。

然后,我在 for 循环之外添加了日志记录语句,以仅检查我的一个对象以查看该字段是否存在而它不存在。所以我的问题是,为什么这个 sn-p 没有在我的对象中添加“NumberForSearch”字段?

【问题讨论】:

  • 这里没有与 JSON 相关的内容。您只是想通过 Angular 将 NumberForSearch 属性绑定到您的 UI,对吗?代码在哪里?
  • 澄清一下:在 JavaScript 中没有 JSON 对象这样的东西;它们是 JavaScript 对象。 JSON 是一种数据交换格式。
  • 很抱歉造成沟通不畅,我将设备阵列导入 Angular 没有问题。我目前在我的应用程序中显示设备的所有其他领域。我的问题是“NumberForSearch”字段不存在。因此让我相信我在上面发布的 sn-p 没有添加“NumberForSearch”字段
  • ` { _id: 55bf8c7782c85cafe90de0a4, UnitClassification: 'BAC', ClassPrefix: 301, UnitNumber: '326', Year: 1999, Make: 'Komatsu', Description: 'Excavator Sold to A. SONGSTER Coupler已安装桶 U#331。',URL:'HeavyEquipment',活动:true,详细信息:{ 所有者:'BLM',型号:'PC200LC-6',SoldDate:2010 年 11 月 4 日星期四 00:00:00 GMT -0600 (MDT) } }` 这是来自 console.log(Equimpent[0]);
  • @JoshBrown:您可能会尝试在列表已绑定之后添加字段。您拥有的代码 修改 Equipment 数组,我只是不太了解 Angular(而且您的帖子中没有足够的代码)来说明它是否是绑定到UI,或者发生的事件的时间线是什么。我强烈建议提供一个我们可以运行的minimal reproducible example

标签: javascript arrays angularjs node.js


【解决方案1】:

在设置为 $scope 的参数之前,您必须使用此字段创建对象。
看看 init() 函数。
添加 NumberForSearch 字段后,我们将对象数组定义为范围内的参数。
当然 ng-repeat 会循环遍历它并渲染元素。
所以我们将添加“| filter:query”来只显示需要的

<div ng-controller="EquipmentController">
  <input type="text" ng-model="query.NumberForSearch" placeholder="search">

  <ul>
    <li ng-repeat="Item in Equipment | filter:query">{{Item.ClassPrefix}}-{{Item.UnitNumber}}</li>
  </ul>
</div>

js部分:

var App = angular.module('App', []);
App.controller('EquipmentController', function ($rootScope, $scope, $http, $filter) {
      $scope.Equipment = [];
      $scope.init = function() {
        var request = $http({
            method: 'get',
            url: '/path/to/equipment/resource'
        });

        request.success(function (response) {
            var Equipment = response.Equipment;
            for(var i in Equipment) {
              Equipment[i].NumberForSearch = Equipment[i].ClassPrefix + "-" + Equipment[i].UnitNumber;
            }
            $scope.Equipment = Equipment;
            $scope.$apply();
        });
      }

      $scope.init();
});

另一种过滤方式是将搜索字段发送到路由,换句话说,我们将查询发送到服务器并过滤服务器端的响应。

<div ng-controller="EquipmentController">
  <input type="text" ng-model="queryNumber" ng-change="searchByNumber()" placeholder="search">

  <ul>
    <li ng-repeat="Item in Equipment">{{Item.ClassPrefix}}-{{Item.UnitNumber}}</li>
  </ul>
</div>

js部分:

var App = angular.module('App', []);
App.controller('EquipmentController', function ($rootScope, $scope, $http, $filter) {
      $scope.Equipment = [];

      $scope.all = function() {
        var request = $http({
            method: 'get',
            url: '/path/to/equipment/resource'
        });

        request.success(function (response) {
            $scope.Equipment = response.Equipment;
            $scope.$apply();
        });
      }

      $scope.all();

      $scope.searchByNumber = function() {
        var request = $http({
            method: 'get',
            url: '/path/to/equipment/resource?number='+$scope.queryNumber
        });

        request.success(function (response) {
            $scope.Equipment = response.Equipment;
            $scope.$apply();
        });
      }
});

【讨论】:

  • 刚刚决定在 Angular 中而不是在节点端修改设备。谢谢。
猜你喜欢
  • 2017-03-19
  • 2019-02-24
  • 2015-12-24
  • 2020-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-13
  • 2012-07-21
相关资源
最近更新 更多