Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript js中对象属性访问的处理_Javascript_Angularjs - Fatal编程技术网

Javascript js中对象属性访问的处理

Javascript js中对象属性访问的处理,javascript,angularjs,Javascript,Angularjs,下面是我的js的样子 $scope.tasks = [ { "name":"task 1", "date":"2 May 2014" }, {"name":"task 2", "date":"2 May 2014" } ]; html {{task.name} 我想尽量避免{{task.name}}以保持标记更干净。我尝试了$scope.tasks=$scope.tasks.name在JS中,但它不工作 $scope.tasks

下面是我的js的样子

$scope.tasks = [
    {
    "name":"task 1",
    "date":"2 May 2014"
    },

    {"name":"task 2",
    "date":"2 May 2014"
    }
];
html

  • {{task.name}
我想尽量避免
{{task.name}}
以保持标记更干净。我尝试了
$scope.tasks=$scope.tasks.name
JS
中,但它不工作

$scope.tasks = [
    {
    "name":"task 1",
    "date":"2 May 2014"
    },

    {"name":"task 2",
    "date":"2 May 2014"
    }
];

var temp = [];

for(var task in $scope.tasks){
    temp.push(task.name);
}

$scope.tasks = temp;
这会满足你的要求。但是,它将覆盖您的原始对象

我认为你把事情搞得太复杂了,很难理解角度的基本概念

就我个人而言,我甚至认为这会让事情变得更糟。在
ng repeat
中,您告诉Angular它应该在
tasks
中列出每个
任务。然后,它应该显示每个任务的名称。这显然就是任务名aka
task.name
。通过省略术语
任务
,您的代码将更难阅读,因为您看不出名称的含义。

以下是如何做到这一点

在控制器中,您需要监视更改:

// Run whenever tasks changes.
$scope.$watch("tasks", function(tasks) {
  // Tasks may be be undefined or nil.
  if (tasks) {
    // Map the array to pick out the titles.
    $scope.taskTitles = tasks.map(function(task) { return task.title })
  }
}
如果不这样做,您的列表将不会在任务更改时更新。这种“观察”是角度测量的一个基本部分

然后在模板中需要迭代

<ul ng-repeat="task in taskTitles track by $index">
    <li>{{task}}</li>
</ul>
  • {{task}}
如果您的标题有可能重复,您需要
曲目


所以你可以做,但它不干净。我建议你坚持你所拥有的。

你为什么要避免这种情况?为什么您认为它会使您的标记更干净?当然,这一更改意味着使其他地方的代码复杂化。@Joe,正如您所看到的,我必须在标记中键入task.name。如果这只是一项任务,那就太好了。我希望在我的js中,我可以使tasks=tasks.name。“这会很好”有时是一个很好的理由,但很少。如果这意味着在其他地方使代码复杂化,那么这是个坏主意。依我拙见您的逻辑是“迭代任务并显示每个任务的名称”,而您当前的代码是最干净的表达方式。我已经添加了一个答案,说明如何做到这一点。它回答了你关于如何做的问题,也表明它看起来不太好看。不,不会的。它打破了观察任务变化的模板。@Joe所说的当然是正确的。我忘了提到,您必须应用进一步的更改才能使其工作,很明显,因为您的ng repeat依赖于原始对象
<ul ng-repeat="task in taskTitles track by $index">
    <li>{{task}}</li>
</ul>