【问题标题】:Directive Isolate Scope 1.2.2指令隔离范围 1.2.2
【发布时间】:2013-12-05 01:30:00
【问题描述】:

我第一次使用 Angular 版本 1.2.2 并尝试制作一个简单的指令,该指令使用带有 '=' 绑定的隔离范围来传递对象。我之前已经做过几次了,所以我想知道 1.2.2 中是否有一个改变改变了这一点?

这是我的指令:

.directive('vendorSelector', function (VendorFactory) {
    return {
        restrict: 'E',
        replace: true,
        scope: { vendorId: '=' },
        template:   '<select ng-model="vendorId" ng-options="id for id in vendorIds">' +
                        '<option value="">-- choose vendor --</option>' +
                    '</select>',
        link: function (scope, element, attrs) {
            VendorFactory.getVendorIds().then(function(result) {
                scope.vendorIds = result;
            });
        }
    }
})

我使用该指令的 HTML 模板如下:

<div class="padding">
    <vendor-selector vendorId="someValue"></vendor-selector>
    {{ someValue }}
</div>

还有后备控制器:

.controller('AddProductController', function($scope, ProductFactory, AlertFactory) {
    $scope.vendorId = 0;
    $scope.someValue = undefined;
})

我尝试在 html 模板中同时使用 $scope.someValue 和 $scope.vendorId 作为提供的对象。在这两种情况下,我得到的错误都是Expression 'undefined' used with directive 'vendorSelector' is non-assignable!。我是否遗漏了一些明显的东西来阻止这些值在隔离范围内被双向绑定?

【问题讨论】:

    标签: javascript angularjs angularjs-directive angularjs-scope


    【解决方案1】:

    在您的 html 中:

    <vendor-selector vendorId="someValue"></vendor-selector>
    

    更改vendorId="someValue"

    vendor-id="someValue"

    HTML 属性不区分大小写,以避免混淆 Angular 将所有驼峰式大小写变量 (vendorId) 转换为蛇形大小写属性 (vendor-id)。

    所以someValue 没有绑定到vendorId。导致vendorId 在模板中未定义。因此你的错误。

    【讨论】:

    • 谢谢!你是一个绅士和一个学者。我应该更清楚,因为我已经适当地更改了 camelCase 的指令名称,只是完全错过了属性:P
    • 在 1.2 中发生了很多变化,包括与隔离范围相关的变化,所以我完全赞同你的想法。不客气!
    • 有很多变化:也就是说,它有效! (不接管同一元素上非隔离指令的范围。)此外,链接优先级是相反的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多