【问题标题】:Rich tabs and transcluded content丰富的标签和嵌入​​的内容
【发布时间】:2014-11-04 11:14:13
【问题描述】:

我目前有这个问题:我制作了 3 个指令(检查 plunkr 的“简化”测试用例,不要介意它们来自 Typescript 的闭包)控制选项卡,使用控制器将它们分组,因为我可以有更多比当前视图上的一个选项卡式内容。 The problem happens when the tab itself has some bindings that are located outside of the scope, and when the tab is 'transcluded' in place, the binding never updates because the scope is different.

这是 plunkr http://plnkr.co/edit/fnw1oV?p=preview,这是重要的“标签嵌入”部分

    this.link = function (scope, element, attr) {
        var clickEvent, el, item;
        item = scope.item;
        console.log(scope);

        el = item.element.filter('.is-tab');

        el.addClass('picker-tabs-item');

        clickEvent = 'tabs.select(item);';
        if (el.is('[ng-click]')) {
            clickEvent += el.attr('ng-click') + ';';
        }

        el.attr('ng-click', clickEvent);
        el.attr('ng-class', 'tabs.classes(item)');

        item.element = $compile(item.element)(scope);

        element.replaceWith(item.element);
    };

当前的方法感觉很老套(将原始范围和元素保留在数组中)。另外,在我的应用程序中,数据是在加载选项卡后加载的,因此它甚至无法保留一些初始状态。选项卡现在看起来像这样:

以及它的外观(但不起作用,您可以看到单击一个选项卡选择所有选项卡):

来自我的应用程序的真实标签代码:

<div class="clearfix" login-space user-space>
<div class="picker clearfix" ng-class="{'to-hide': user.data.get('incomplete') || checkout.checkoutForm.$invalid}">
    <div class="pick-title icon icon-pay">Forma de Pagamento</div>
    <div class="for-hiding">
        <div tabs="pagamento">
            <div tab="/templates/tabs/plans/credito" selected="true">
                <button class="is-tab clicky" ng-disabled="checkout.disabledTab('credito')" type="button">
                    Cartão
                    <span class="pick-pill-indicator-placeholder" ng-bind="checkout.total('credito')"></span>
                </button>
            </div>
            <div tab="/templates/tabs/plans/debito">
                <button class="is-tab clicky" ng-disabled="checkout.disabledTab('debito')" type="button">
                    Débito
                    <span class="pick-pill-indicator-placeholder" ng-bind="checkout.total('debito')"></span>
                </button>
            </div>
            <div tab="/templates/tabs/plans/boleto">
                <button class="is-tab clicky" ng-disabled="checkout.disabledTab('boleto')" type="button">
                    Boleto
                    <span class="pick-pill-indicator-placeholder" ng-bind="checkout.total('boleto')"></span>
                </button>
            </div>
        </div>
    </div>
</div>
</div>

login-spaceuser-space 是仅将其分配给登录和用户控制器的指令。 checkoutui-view 中的当前控制器。

$stateProvider.state('planos.checkout', {
    url: '/checkout',
    templateUrl: '/templates/partials/plans/checkout',
    controllerAs: 'checkout',
    controller: Controllers.Checkout,
    data: {
        allowed: false,
        enclosed: true
    }
});

由于checkout 控制器只能实例化一次,我无法重新实例化它,但仍需要访问它的功能和绑定数据。

'/templates/partials/plans/checkout' 包含上面的选项卡代码(所以是的,从技术上讲,它与checkout 控制器在同一范围内)

【问题讨论】:

    标签: javascript angularjs tabs


    【解决方案1】:

    在您的 plunker 中,将您的标签更改为:

    <span data-subctrl="">{{ subctrl.sum('credito') }}</span>
    

    显示总和。我查看了 subctrl 是什么,您将其作为指令,这就是 subctrl.sum 不起作用的原因。 Plunker 与它工作:http://plnkr.co/edit/qwEHMqfzJ6pC79hM8cDj?p=preview

    如果这不是您的应用程序的问题,请再描述一下。

    【讨论】:

    • 我已经更新了我的 OP。这是一个过于简单的 plunkr,只是试图归结为问题,但我已经解释了绑定和范围在编辑中的来源
    • 仍然是同样的问题...看起来您的应用不知道“结帐”是什么。仅仅因为您将其设为控制器并不意味着 dom 可以访问它。
    • console.log 放在 subctrl 控制器中,您就会明白。我不能多次初始化控制器。因此我无法将其插入选项卡内的元素
    • 这隐含地意味着我不能多次 $compile 元素(尽管它在路由加载时已经编译,然后被嵌入)
    • 虽然我没有使用你在 plunkr 中所做的确切方式,但我提供了一个类似于“ng-transclude”指令的解决方案
    【解决方案2】:

    通过删除选项卡的 html 内容,并对内部内容应用不同的范围,然后重新附加到原始元素来解决此问题。

    this.link = function (scope, element, attr) {
        var clickEvent, el, item;
        item = scope.item;
        console.log(scope);
    
        el = item.element.filter('.is-tab');
        var contents = el.html(); //added
        el.empty(); // added
    
        el.addClass('picker-tabs-item');
    
        clickEvent = 'tabs.select(item);';
        if (el.is('[ng-click]')) {
            clickEvent += el.attr('ng-click') + ';';
        }
    
        el.attr('ng-click', clickEvent);
        el.attr('ng-class', 'tabs.classes(item)');
    
        item.element = $compile(item.element)(scope);
        item.element.append($compile('<div>' + contents + '</div>')(item.scope)); //added
    
        element.replaceWith(item.element);
    };
    

    【讨论】:

      猜你喜欢
      • 2011-06-14
      • 2021-04-25
      • 2021-10-01
      • 2021-07-17
      • 2019-06-02
      • 1970-01-01
      • 1970-01-01
      • 2023-03-05
      • 1970-01-01
      相关资源
      最近更新 更多