Javascript 为什么下面的$scope在此函数中变为空?
为什么Javascript 为什么下面的$scope在此函数中变为空?,javascript,angularjs,Javascript,Angularjs,为什么panodataName在$scope.addPanodata函数中变为空 HTML: <input type="text" class="form-control" ng-model="panodataName" style="width:auto;padding:0;"> <a class="btn btn-primary" href="javascript:;" ng-click="addPanodata(pano.objectId)">Add</a&g
panodataName
在$scope.addPanodata
函数中变为空
HTML:
<input type="text" class="form-control" ng-model="panodataName" style="width:auto;padding:0;">
<a class="btn btn-primary" href="javascript:;" ng-click="addPanodata(pano.objectId)">Add</a>
angular.module('yoApp')
.controller('addPanoCtrl', function($q, $scope, $rootScope, $routeParams, serviceUpload) {
$scope.panodataName = ''
$scope.addPanodata = function(panoId) {
var Panodata = AV.Object.extend('PanoramaData'),
panodata = new Panodata(),
panoJSON = _.where($scope.building.pano, {'objectId': panoId})
$scope.pano = panoJSON[0]
console.log($scope.panodataName)
console.log($scope.panodataName)
panodata.save(json, {
success: function(object) {
},
error: function(object, error) {
}
})
}
我觉得很奇怪,因为如果我这样做:
{{panodataName}}
你说你在一个
ng repeat
中得到了这个逻辑。我想这是你的问题
angular对ng重复的每次“写入”所做的是创建一个新的范围
。因此,您的ng model=“panodataName”
将名为panodataName
的属性绑定到循环特定迭代的本地范围,而不是全局控制器范围
另外,如果您在ng repeat中添加{{panodataName}}
,那么这将起作用并打印输入文本,因为它绑定到ng repeat的子范围
我相信您想要的是绑定到ng repeat
的父范围。这是您实际定义panodataName
属性的地方,也是您试图记录的内容
为此,您还需要更改ng型号:
ng-model="$parent.panodataName"
$parent
是指向ng repeats
父范围的特定循环范围的全局变量
希望这是有意义的,我添加了一个小提琴演示
注意:这个实现有一个缺点,因为现在每个输入都绑定到同一个变量,如果您更新一个,ng repeat中的所有其他输入都将更新
编辑:增加了证据
这表明ng repeat
创建了新的作用域
另外,谷歌搜索了一点,找到了一个答案,其中的注释描述了为什么避开$parent
是一个好主意。您没有在$scope.addPanodata函数的$scope.panodataName中添加任何值。添加后,只有值不会被定义。您对$scope.panodataName
在addPanodata()
中,除了在控制台中显示它之外。我以为`ng model=“panodataName”`应该为$scope.panodataName?
中的某个地方添加一个值:
`$scope.addPano=function(){var Pano=AV.Object.extend('Panorama'),Pano=new Pano()var json={'name':$scope.panoName,'buildingCode':$scope.buildingId`并且正在$scope.addPano
中检索该值。请提供整个html文件。也许您可以使用Plunker()为此目的。ng repeat
创建新的作用域,但这些作用域继承自其父作用域。ng model
如果名称中有一个“点”,则可以正常工作。此外,您还可以从ng repeat
使用ng model=“ref.panodataNameList[$index]“
@georgeawg你说得对,我忘了,我想这就是为什么allot的人不喜欢直接绑定作用域,而是绑定子属性。
ng-model="$parent.panodataName"