【问题标题】:Directive not working with ng-if指令不适用于 ng-if
【发布时间】:2017-01-25 18:36:52
【问题描述】:

除非我在包含元素上也使用 ng-if,否则我有以下指令可以正常工作。我想要做的只是在范围上设置一个具有关联函数的动态属性。范围不包含属性(未定义)。

任何帮助都会很棒!

app.directive('stRefresh', function () {
    return {
        require: '^stTable',
        link: function (scope, ele, attr, ctrl) {
            if (attr.stRefresh) {
                var name = attr.stRefresh;
                scope[name] = scope[name] || {};
                scope[name].refresh = function () {
                    return ctrl.search();
                };
            }
        }
    }
});

【问题讨论】:

  • 你能解释一下发生了什么不正确的事情
  • 范围不包含属性(未定义)
  • 您为此使用 ng-if 的任何特殊原因,ng-show 总体上更快,并且可能会解决问题
  • 是的,有一个特殊原因我不希望将元素添加到 DOM。
  • 如果您的错误是“范围不包含属性(未定义)”,这意味着 name 变量未定义。您是否尝试过使用调试器逐步完成此操作或添加一些日志记录?编辑:经过考虑,我怀疑由于我的回答中描述的问题,未定义的错误来自控制器代码。我说的对吗?

标签: angularjs angularjs-directive angular-directive


【解决方案1】:

知道什么不起作用会很有帮助,但我怀疑你被the problem of nested scopes咬了。

ng-if 指令创建一个子作用域。当您修改指令中的范围时:

scope[name] = scope[name] || {};

您正在修改子范围。由于原型继承,这不会修改父级的范围。因此,如果您希望看到父作用域发生变化,您将看不到它。

要修复它,您需要在范围引用中添加一个点。像这样的:

scope.data[name] = scope.data[name] || {};
scope.data[name].refresh = function () {
    return ctrl.search();
};

scope.data 属性必须是对对象的引用。由于您没有修改引用,因此您可以从父范围和子范围修改该对象的属性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-24
    • 2021-11-27
    • 2015-01-18
    • 2015-07-14
    • 2015-05-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多