【问题标题】:Angularjs directive change scope variableAngularjs指令更改范围变量
【发布时间】:2014-05-18 11:56:55
【问题描述】:

我还是指令的新手,因此无法完全理解它是如何工作的,希望有人能够在用户单击 ng-repeat 上的项目时帮助我将范围变量传递给指令。

代码如下所示

html

<tr ng-repeat='item in loadSummaries.items' ng-animate="{enter: 'animate-enter', leave: 'animate-leave'}">
    <td>{{item.ShipmentId}}</td>
    <td><button ng-click="showDetails(item)">details</button></td>
</tr>

指令被注入如下

<div id="searchRoot" class="embed-edit-item-form">
<div id="content-outer" class="row">
    <div id="form-holder">
        <div id="edit-form-content">
            <div id="edit-form-content-inner" style="background-color: transparent">
                <div ng-include src="'Client/Views/Shipper/shipment_details.html'">
                </div>
            </div>
            <div class="clear" style="clear: both">
            </div>
        </div>
    </div>
</div>

控制器

$scope.showDetails = function (item) {
    $scope.Message = "Details Clicked";
    $scope.$broadcast('event:show-edit-form', item);
}

和指令。 编辑 2

app.directive('embedEditItemForm', function () {
return {
    restrict: 'C',
    template: "<div></div>",
    transclude: true, //use transclusion
    scope: {},
    link: function (scope, elem, attrs, controller, linker) {
        linker(scope, function (clone) { //bind the content inside 
            elem.children().eq(0).append(clone); // add content to DOM

            var bidHolder = elem.find('#form-holder');
            var searchResult = elem.find('#searchResult');
            bidHolder.hide();
            scope.$on('event:show-edit-form', function (item) {
                scope.Shipment = item;
                searchResult.hide();
                bidHolder.slideDown('slow', function () {
                });
            });
            scope.$on('event:close-edit-form', function () {
                searchResult.show();
                bidHolder.slideUp();
            });
        });
    }
}

});

我遇到的问题是如何将项目从 ng-repeat 传递到“shipment_details.html”,以便我可以在那里显示更多详细信息。指令scope.Shipment = item; 中的代码不起作用。

编辑 1 完整的部分页面如下:

<div id="searchRoot" class="embed-edit-item-form">
<div id="content-outer" class="row">
    <div id="form-holder">
        <div id="edit-form-content">
            <div id="edit-form-content-inner" style="background-color: transparent">
                <div ng-include src="'Client/Views/Shipper/shipment_details.html'">
                </div>
            </div>
            <div class="clear" style="clear: both">
            </div>
        </div>
    </div>
</div>
<div id="searchResult">
    <div infinite-scroll='loadSummaries.nextPage()' infinite-scroll-disabled='loadSummaries.busy' infinite-scroll-distance='1'>

        <table class="table">
            <thead>
                <tr>
                    <th>Shipment ID</th>
                    <th</th>
                </tr>
            </thead>
            <tbody>
                <tr ng-repeat='item in loadSummaries.items'>
                    <td>{{item.LoadId}}</td>
                    <td><button ng-click="showDetails(item)">details</button></td>
                </tr>
            </tbody>
        </table>
        <div ng-show='loadSummaries.busy'>Loading data...</div>
    </div>
</div>

问候 基兰

【问题讨论】:

    标签: angularjs angularjs-directive


    【解决方案1】:

    如文档中所述:

    在典型设置中,小部件会创建一个隔离范围,但 transclusion 不是child,而是isolate scope 的兄弟。这 使小部件可以拥有私有状态,并且 嵌入要绑定到父(预隔离)范围。

    您的内容需要从指令的范围继承才能工作。在这种情况下,一个简单的解决方案是通过删除 scope:{} 来避免使用隔离范围。

    我想指出为什么这是 angular 的预期行为。嵌入的内容是任意的,因此它不应该了解您的指令的实现细节(可以使用什么)。

    如果您决定嵌入的内容属于指令,则将其作为指令模板的一部分(不要使用嵌入)更有意义。

    更多信息:

    Transclusion and scopes in angular: Why is this not working?

    Why ng-transclude's scope is not a child of its directive's scope - if the directive has an isolated scope?

    Confused about Angularjs transcluded and isolate scopes & bindings

    【讨论】:

    • 我对广播没有意见。一切正常。我遇到的问题是scope.$on('event:show-edit-form', function (item) 正在接收正确的项目,但我不知道如何将其设置为应用指令的 div 的范围。顺便说一句,我不明白您所说的父子关系是什么意思。
    • @Kiran:角度范围是继承的,因此范围之间存在子/父关系。我误解了你的问题。你能告诉我你在哪里使用你的embedEditItemForm 指令以及你的shipment_details.html 是什么样的吗?我猜有一个元素searchResult,但我不确定
    • 我已经添加了适合的部分页面。我想我明白你在说什么,因为我在同一级别有 2 个 div,由于ng-repeat,范围没有正确设置。是否可以为指令定义一个单独的控制器实例来解决这个问题?
    • 我确实按照您在更新后的帖子中看到的建议进行了更改,但现在的问题是 infinite-scroll='loadSummaries.nextPage()' 不起作用。看起来它弄乱了那个范围。我怎样才能保留那个范围?
    • @Kiran:嗯,我的错。我没有看到您的带有指令的 div 也包装了searchResults。查看更新的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-28
    • 2015-12-14
    相关资源
    最近更新 更多