【问题标题】:In AngularJS, how do I use a directive to create a template with changing variable names?在 AngularJS 中,如何使用指令来创建具有更改变量名的模板?
【发布时间】:2013-02-15 21:41:11
【问题描述】:

我正在使用 AngularJS 创建一个问卷表单,并且我正在模板化不同类型的问题,以保持我的 HTML 轻量级。

HTML:

<qtnyesno qtn-variable="testVar">This is a test question. Yes or No?</qtnyesno>
testVar = {{testVar}}

JS:

var module = angular.module('app', [])
.directive('qtnyesno', function() {
        return {
                restrict: 'E', // must be an HTML element
                transclude: true,
                scope: {
                        valvar: '@qtnVariable',
                },
                template:
                    '<div>' +
                    '<label ng-transclude></label>' +
                    '<label class="radio inline"><input type="radio" name="rdo{{valvar}}" value="1" ng-model="{{valvar}}">Yes </label>' +
                    '<label class="radio inline"><input type="radio" name="rdo{{valvar}}" value="0" ng-model="{{valvar}}">No </label>' +
                    '<hr></div>',
                replace: true,
        };
});

当我在输入标签 ng-model="{{valvar}}" 中使用时,会出现编译错误。

当我尝试改用 ng-click="{{valvar}} = 0" 时,我没有收到任何编译错误,但是当我点击时获取 testVar 值的显示语句永远不会起作用单选按钮。

如何解决此问题,以便在单击按钮时使用 testVar 的值正确更新 HTML 的最后一行?

我正在使用 AngularJS 和 Bootstrap。我对这两个框架都很陌生,所以我不确定这是否是最好的方法。

【问题讨论】:

    标签: javascript templates angularjs angularjs-directive


    【解决方案1】:

    Brandon 说得对,在您的隔离作用域中使用 = 以获得双向绑定,但您还需要做一件事:从您的 ng-model 声明周围删除花括号。

    ng-model 声明采用角度表达式并在范围内评估它们,因此无需大括号强制评估。事实上,大括号会把事情搞砸。

    // so just
    ng-model="valvar"
    

    Here's a fiddle with your code with these changes.

    【讨论】:

    • 我刚刚想到的一个问题——单选按钮的名称属性是如何解释的?在 Safari 或 Chrome 开发工具中,变量都显示为 rdo + 给定变量的名称。
    【解决方案2】:

    要在隔离范围内获得双向绑定,请使用=

    scope: {
      valvar: '=qtnVariable',
    },
    

    @ 使结果范围变量成为带插值的字符串。

    【讨论】:

    • 我在模板中使用 ng-click 而不是 ng-model 进行了尝试。没有编译错误;但是,在我在浏览器中生成的 HTML 中(当我查看 FireBug 时),valvar 被替换为空字符串。当我之前使用 ng-click 时,变量被写入 HTML 中的正确位置,但由于某种原因,AngularJS 并没有在该代码上执行任何魔术而不是 HTML 文档的其余部分。
    • 你有 jsFiddle 示例或类似的东西来演示这个问题吗?
    猜你喜欢
    • 2013-01-29
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 2015-09-23
    • 2015-03-17
    • 2014-05-18
    • 1970-01-01
    相关资源
    最近更新 更多