Angularjs 角度指令链接函数中的作用域变量为null

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

我是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="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”
    ,属性的命名方式无关紧要;)