如果我表达不清楚,先向大家道歉。在 ng-repeat
中有一个带有 ng-model
的文本框,当我试图获取文本框中的值时,它总是显示为 undefined
。我只想让它显示对应文本框中输入的内容。
看起来这是一个与 $scope
相关的问题,所以我该如何将 $scope.postText
变成全局变量或者在控制器根级别使其可被访问?
这是 JSFiddle 链接,可以帮助理解情况:http://jsfiddle.net/stevenng/9mx9B/14/
如果我表达不清楚,先向大家道歉。在 ng-repeat
中有一个带有 ng-model
的文本框,当我试图获取文本框中的值时,它总是显示为 undefined
。我只想让它显示对应文本框中输入的内容。
看起来这是一个与 $scope
相关的问题,所以我该如何将 $scope.postText
变成全局变量或者在控制器根级别使其可被访问?
这是 JSFiddle 链接,可以帮助理解情况:http://jsfiddle.net/stevenng/9mx9B/14/
正如 @Gloopy 已经说明的那样,ng-repeat 为您 posts
数组中的每个项目创建一个新的子作用域。由于 posts
数组的每个项目都是原始值(字符串),ng-repeat 还会在每个子作用域上创建一个 post
属性,并将来自数组的适当值分配给它们中的每一个。 ng-repeat 块内部是 ng-model="postText"
。这在每个子作用域上创建了一个 postText 属性。以下是其中两个子作用域的示例:
posts
数组中使用对象而不是基元。例如,$scope.posts = [{type:'tech'},{type:'news'},...];
<input type="text" ng-model="post.postText">
posts
中适当对象的引用,而不是值的副本。因此,post.postText
被创建在父$scope属性posts
上,因此它可见于父作用域。(因此,在这种情况下,子作用域只需调用savePost()
- 不需要将任何值传递给父作用域。)posts
数组将自动更新如下:$scope.posts = [{type:'tech', postText:'this is tech related'},{type:'news'},...];
ng-model="$parent.someProperty"
将表单元素绑定到父作用域上的属性,而不是子作用域上的属性。这种解决方案对于您的情况来说很难实现,并且是一种相当脆弱的解决方案,因为它依赖于HTML结构进行作用域继承...但我提到它是为了完整性。this
代替将值传递给父级。我不喜欢这种方法,因为它很难确定正在访问或修改哪个$scope。我认为最好的方法是仅让在$scope上定义的函数访问和修改自己的$scope。)postText
并在savePost
函数中访问它。如果这不是在ng-repeat中,那么您可以成功地访问单个$scope.postText
,但是ng-repeat为每个项目创建了一个新的作用域。
这里是更新后的fiddle。<div ng-repeat="post in posts">
<strong>{{post}}</strong>
<input type="text" ng-model="postText">
<a href="#" ng-click="savePost(postText)">save post</a>
</div>
$scope.savePost = function(post){
alert('post stuff in textbox: ' + post);
}
function postItemController($scope){
$scope.savePost = function(){
console.log($scope.postText + " which belongs to " + $scope.post +" will be saved")
}
}
angular.module('MyApp',[]);
function PostCtrl($scope) {
$scope.posts = [{heading:'tech',value:''}, {heading:'news',value:''}, {heading:'sports',value:''},{heading:'health',value:''}];
$scope.savePost = function(post){
alert( 'post stuff in textbox: ' + post);
}
}
<div ng-app="MyApp">
<div ng-controller="PostCtrl">
<div ng-repeat="post in posts">
<strong>{{post.heading}}</strong>
<input type="text" ng-model="post.value">
<a href="#" ng-click="savePost(post.value)">save post</a>
</div>
</div>
</div>
post.type
作为参数传递。 - Mark Rajcok