Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/25.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
新手AngularJS控制器$scope无法读取未定义的属性_Angularjs_Controller_Angularjs Scope - Fatal编程技术网

新手AngularJS控制器$scope无法读取未定义的属性

新手AngularJS控制器$scope无法读取未定义的属性,angularjs,controller,angularjs-scope,Angularjs,Controller,Angularjs Scope,我试图解决一个问题,很明显,有些新手有时有角度方面的经验。即使有几个帖子我也没有发现我的小例子的问题。情景: 显示评论和评级的网页 该网站提供了输入新评论/评级的可能性 javascript应该将新条目推送到现有注释数组中 整个故事很容易就有一个控制器,但它的目的是了解控制器的“继承”模型,因此有两个小型控制器 问题: 将新条目推送到控件数组的函数(在controller2中) 现有注释(控制器1)导致TypeError,因为此范围中的数组未定义 “严格使用”; angular.mod

我试图解决一个问题,很明显,有些新手有时有角度方面的经验。即使有几个帖子我也没有发现我的小例子的问题。情景:

  • 显示评论和评级的网页
  • 该网站提供了输入新评论/评级的可能性
  • javascript应该将新条目推送到现有注释数组中
  • 整个故事很容易就有一个控制器,但它的目的是了解控制器的“继承”模型,因此有两个小型控制器
问题:

  • 将新条目推送到控件数组的函数(在controller2中) 现有注释(控制器1)导致TypeError,因为此范围中的数组未定义
“严格使用”;
angular.module('confusionApp',[])
.controller('DataController',['$scope',函数($scope){
$scope.comments=[{评级:1,评论:“bla”,作者:“pma”,日期:new date().toISOString()},{评级:2,评论:“harakiri”,作者:“hku”,日期:new date().toISOString()}];
}])
.controller('CommentController',['$scope',函数($scope){
$scope.comment={评级:5,注释:,作者:,日期:new date().toISOString()};
$scope.submitComment=函数(){
log($scope.comment);
$scope.comment.date=new date().toISOString();
//此处的此作用域不知道注释数组-->错误
$scope.comments.push($scope.comment);
$scope.commentForm.$setPristine();
$scope.comment={评级:5,注释:,作者:,日期:new date().toISOString()};
log($scope.comment);
};
}])

;通常,它是每个视图一个控制器。在同一视图中有两个控制器:DataController和CommentController

数组应存储在服务中(将其注入两个控制器中;CommentController向服务的数组添加注释;DataController从中读取)

当ng click(CommentController)触发一个通常应该刷新DataController中使用的数组的事件时,事情变得复杂起来

正确的方法是只使用一个控制器

下面是我如何为阵列设置服务的:

.service('CommentService', function() {
  var comments = [
    {rating: 1, comment:"bla", author: "pma", date: new Date()}, 
    {rating:2, comment:"harakiri", author:"hku", date: new Date()}
  ];

  return {
    comments: comments
  }
})


(但解决方案不完整;只需使用一个控制器)

您想了解如何继承控制器作用域。在您的示例中出错的地方是CommentController实际上不是DataController的子控制器,因此不会继承作用域

因此,您需要确保在HTML中DataController是CommentController的父级。实现这一点的简单方法是将DataController移动到body元素:

<body ng-controller="DataController"> 

一种方法是使用$broadcast服务将第二个控制器中的带有注释的事件广播到第一个控制器(这将广播到您的rootscope)。在第一个控制器中注册$on事件以检查广播的事件。