Angularjs 角度指令链接函数中的作用域变量为null
我是angularjs的begginer。我有一个Angle指令,并使用它作为ASP.NET MVC项目:Angularjs 角度指令链接函数中的作用域变量为null,angularjs,angularjs-directive,Angularjs,Angularjs Directive,我是angularjs的begginer。我有一个Angle指令,并使用它作为ASP.NET MVC项目: 'use strict'; app.directive('province', function (Province, $rootScope) { return { restrict: 'E', replace: true, template: '<select data-ng-model="province" data-ng-options="provinc
'use strict';
app.directive('province', function (Province, $rootScope) {
return {
restrict: 'E',
replace: true,
template: '<select data-ng-model="province" data-ng-options="province.provinceId as province.provinceName for province in provinces" ' +
'data-ng-change="provinceChanged()"></select>',
link: function (scope, element, attr, controller) {
Province.get().then(function (provinces) {
scope.provinces = provinces;
});
console.log(scope.provinces);
scope.province = false;
scope.provinceChanged = function () {
if (!scope.province) {
return;
}
$rootScope.$broadcast("provinceChanged", { province: scope.province });
};
}
};
})
“严格使用”;
应用指令('province',函数(province,$rootScope){
返回{
限制:'E',
替换:正确,
模板:“”,
链接:函数(作用域、元素、属性、控制器){
get().then(函数(省){
范围.省=省;
});
console.log(scope.provides);
scope.province=false;
scope.provinceChanged=函数(){
如果(!scope.province){
返回;
}
$rootScope.$broadcast(“provinceChanged”,{province:scope.province});
};
}
};
})
这是我使用它的方式:
<province id="province" class="form-control" data-selected-province="@Model.Province"/>
select元素正确显示省份。现在我想为select元素设置一个默认值。所以我使用属性data selected province
,并将其设置为从服务器获取的值(@Model.province
)。我想我应该循环查看scope.provides
,找到provinceId
等于数据所选省份
属性的省份的索引,并将scope.province
即ng model
设置为该索引。但是当我使用console.log
将其打印到控制台时,scope.provinces
是未定义的
。我有两个问题:
scope.provides
为空李>
scope.province
设置为attr.selectedProvince
。但我仍然有一个问题。当我将scope.province
设置为一个常量,如scope.province=8
时,它可以正常工作,但当我将data selected-province=8
设置为无效。我可以在firebug中看到,在呈现指令时,该属性等于8
任何帮助都会提前得到感谢。正如Ajay Beniwal在他的评论中指出的那样,
Provence.get()
是一个异步操作,因此您需要将控制台.log
移动到回调函数中以使其工作:
Province.get().then(function (provinces) {
scope.provinces = provinces;
console.log(scope.provinces);
});
对于第二个问题,我建议您使用数据选定省id
属性,而不是数据选定省
,因为属性总是字符串,简单的id值更容易处理。一旦具备了该功能,您可以在链接功能中尝试以下操作:
link: function(scope, element, attr) {
...
scope.provience = attr.selectedProvienceId;
...
}
您将始终处于未定义状态,因为。然后是aynsc操作,需要一些时间才能完成,因此在完成之前,您将打印范围。最终将为您提供未定义值的省份实际上应该是
scope.province=attr.selectedProvinceid
。它不再起作用了。但是当我设置一个常数,如scope.province=8
时,它就起作用了。@初学者我更新了答案,属性应该命名为data selected-provinceid
,然后你可以使用attr.selectedprovinceid
。您确定您的属性selectedProvinceid
的值实际上是一个id吗?是。当我设置一个常量时,它就工作了。我甚至在元素中传递了一个常量<代码>所选省份的数据id=“8”。我可以在fire bug中看到该属性是8。当@Ye Liu提到该值时,该值应该是整数,因为provinceId
中用于生成选项的ng option
是整数。因此scope.province=parseInt(arrt.selectedProvince)
解决了这个问题。将attr selected province
更改为attr selected province id
不会将属性类型更改为int。@初学者,太棒了!我的建议是不要在属性中使用对象,因为它不清楚它是id还是data selected Provincy=“@Model.provide”
,属性的命名方式无关紧要;)