在 AngularJS 中隔离作用域回退

Posted

技术标签:

【中文标题】在 AngularJS 中隔离作用域回退【英文标题】:Isolate scope fallback in AngularJS 【发布时间】:2015-02-17 03:07:39 【问题描述】:

我正在尝试为输入框构建一个自定义指令,它具有 input-model 作为用作 ng-model 的属性。此输入模型属性与内部范围变量有两种方式绑定。

templateUrl:'/components/directives/inputBox.html',
transclude:true,
restrict: 'A',
scope:
  userInput : '=inputModel'

现在的问题是,当我在主 html 中明确提供输入模型时,它可以正常工作。但是当没有提供输入模型时我想要一个后备,那么应该删除双向绑定。模板是这样的

<input id="searchinput" type="search"
               name="inputBox"
               class="form-control"
               placeholder="placeholder"
               ng-model="userInput"
               ng-pattern="pattern"> 

所以,当我没有在主 html 中提供 input-model 属性时

<div input-box></div>

绑定按预期失败,出现错误:

Error: [$compile:nonassign] Expression 'undefined' used with directive 'inputBox' is non-assignable!

我想回退以避免这种情况。我应该如何进行?

【问题讨论】:

【参考方案1】:

您可以在编译方法中检查定义的属性,这将允许您在绑定发生之前处理情况。

    return 
    template: '<div>userInput - test</div>',
    transclude: true,
    restrict: 'A',
    scope: 
        userInput: '=inputModel'
    ,
    compile: function(element, attrs, transclude) 
        if (!attrs.inputModel) 
            attrs.inputModel = 'userInput';
        
        return 
            pre: function(scope, element, attrs) ,
            post: function(scope, element, attrs) 
        
    
;

http://jsfiddle.net/anf4ryzL/

【讨论】:

谢谢!但是有一个问题,如果我使用编译,那么我不能使用链接?那么在哪里注入链接功能呢?在帖子块中? Compile 返回两个方法,一个 pre-link 和 post-link 这些是你的链接函数。默认情况下,在 compile 外部使用的链接方法与 post 方法相同,因此您可以像使用链接一样使用 post: function() 好的。那么如果我可以在编译本身中处理预绑定逻辑,那么何时使用 pre: function() 块? 编译的工作方式分 3 步,首先 angular 运行一个指令编译函数,然后运行它自己的编译函数来设置你的隔离范围(这就是我们在编译函数中设置属性的原因首先),然后它将范围、元素和属性传递给预链接方法,并按父>子的顺序运行这些方法,然后以相反的子>父的顺序运行后链接方法。这意味着您可以 A. 在 Angular 使您的范围(编译)之前做一些事情,B. 在所有子指令链接运行之前做一些事情(预链接),C. 在子指令链接之后做一些事情(链接后) compile 和 pre-link/post-link 的区别在于 compile 还没有作用域,你的指令的隔离作用域是在 compile 和 link 之间创建的【参考方案2】:

此解决方案对您有用吗?

Angular directive with default options

【讨论】:

以上是关于在 AngularJS 中隔离作用域回退的主要内容,如果未能解决你的问题,请参考以下文章

在 AngularJS 中从没有隔离范围的指令调用控制器函数

何时以及为何使用 &?、=?、@?在 AngularJS 中?

angularjs ng-if会创建新的作用域吗

AngularJS 指令的 Scope (作用域)

构建自己的AngularJS - 作用域和Digest

AngularJS-Scope作用域和控制器