我有actionButtons指令:

function actionButtons(){
    'use strict';
    return {
        scope: {},
        restrict: 'AE',
        bindToController: {
            itemId: '@',
            itemDescription: '@',
            actionsText: '@',
            previewAction: '&',
            previewText: '@',
            editAction: '&',
            editText: '@',
            removeAction: '&',
            removeText: '@'
        },
        controller: ActionButtonsController,
        controllerAs: 'actionButtonsCtrl',
        templateUrl: 'src/views/directives/actionButtons.html'
    };
}


使用ActionButtonsController控制器:

/**
 *
 * @constructor
 */
function ActionButtonsController() {
    'use strict';
    var viewModel = this;
    //not important assertions
    }
    /**
     *
     * @type {boolean}
     */
    viewModel.hasItemDescription = typeof viewModel.itemDescription === 'string' &&
        viewModel.itemDescription.length > 0;
    /**
     *
     * @type {string}
     */
    viewModel.previewText = viewModel.previewText || 'preview';
    /**
     *
     * @type {string}
     */
    viewModel.editText = viewModel.editText || 'edit';
    /**
     *
     * @type {string}
     */
    viewModel.removeText = viewModel.removeText || 'remove';
    /**
     *
     * @type {string}
     */
    viewModel.actionsText = viewModel.actionsText || 'Actions';

    viewModel.preview = function() {
        viewModel.previewAction();
    };

    viewModel.edit = function() {
        viewModel.editAction();
    };

    viewModel.remove = function() {
        viewModel.removeAction();
    };
}


还有他的模板的一部分,带有按钮:

<div class="visible-xs-block btn-group" data-dropdown>
<button class="btn btn-block btn-primary" id="{{::(actionButtonsCtrl.itemId)}}" type="button"
        data-dropdown-toggle aria-haspopup="true">
    {{actionButtonsCtrl.actionsText}} <span class="sr-only" data-ng-if="::actionButtonsCtrl.hasItemDescription">
        for {{::(actionButtonsCtrl.itemDescription)}}</span></button>
</div>


这就是我在应用程序中的称呼方式:

<td class="col-md-3 col-xs-3 text-center">
    <div data-action-buttons
         data-item-id="{{author.id + '_' + author.name + '_' + author.surname}}"
         data-item-description="{{author.name + ' ' + author.surname}}"
         data-preview-action="authorCtrl.preview(author)"
         data-edit-action="authorCtrl.edit(author)"
         data-remove-action="authorCtrl.remove(author)"
        ></div>
</td>


问题是:从控制器代码中可以看到,例如,不需要actionsText,如果不存在,则将其设置为Actions。也不需要itemDescription。但是,如果我指定itemDescription,它始终在HTML DOM中可见,但是Actions的行为对我来说却很奇怪:它设置为默认值Actions,但在HTML DOM中不可见。两者之间的区别在于actionsText在控制器的代码中显式绑定到this,但是我认为这是bindToController的默认行为,当我要设置默认值而不是value时,应该这样做当下。同样,当我调试它时(例如,通过调用函数之一),actionsText具有undefined值,尽管事实是,如果在创建它时对其进行调试,则会设置默认的Actions值。它不适用于一次性绑定(使用::)和正常情况。也许与指令代码中的scope: {}有关,但我无法弄清楚,希望对您有所帮助-谢谢您。附言我尝试从控制器返回viewModel变量-它没有帮助。附言2如果指定了actionsText(如data-actions-text={{'Something'}}),则效果很好

最佳答案

您正在使用bindToController,它间接将范围值添加到控制器this上下文中。但是发生此问题是因为您在@表达式中使用了bindToController符号。

每当出现controllerAsbindToController和范围为@角度的情况时,都会以明显不同的方式处理此问题。

实际上,当您在带有@controllerAs角的隔离范围内的范围变量上使用bindToController时,请在该$observeangular code for same上给出的表达式上使用attribute进行监视

该解决方案将使用$timeout进行将使用隔离范围值的@获取的所有分配。因为值在$observe表达式求值后的下一个摘要周期循环中绑定。



function ActionButtonsController() {
    'use strict';
    var viewModel = this;
    $timeout(function() {
        viewModel.hasItemDescription = typeof viewModel.itemDescription === 'string' &&
            viewModel.itemDescription.length > 0;

        viewModel.previewText = viewModel.previewText || 'preview';

        viewModel.editText = viewModel.editText || 'edit';

        viewModel.removeText = viewModel.removeText || 'remove';

        viewModel.actionsText = viewModel.actionsText || 'Actions';
    })

    viewModel.preview = function() {
        viewModel.previewAction();
    };

    viewModel.edit = function() {
        viewModel.editAction();
    };

    viewModel.remove = function() {
        viewModel.removeAction();
    };
};


这是detailed version answer

关于javascript - Angular:带有bindToController的指令``丢失''数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31629079/

10-12 06:53