【问题标题】:Error: Non-assignable model expression: undefined错误:不可分配的模型表达式:未定义
【发布时间】:2012-11-27 23:08:19
【问题描述】:

我正在尝试为指令编写测试,因此我使用$compile 手动构建它。 (是的,我知道我可以为此使用 e2e 测试,但在这种情况下,我想测试一些独立于 DOM 的逻辑,因此我使用了单元测试方法。)

我有一个与scope: {foo: '='} 绑定的字段。当我尝试在指令的范围内设置它时,我收到以下错误:

Error: Non-assignable model expression: undefined (directive: foo)
    at Error (<anonymous>)
    at $get.parentSet (https://ajax.googleapis.com/ajax/libs/angularjs/1.0.2/angular.js:4146:25)
    at Object.<anonymous> (https://ajax.googleapis.com/ajax/libs/angularjs/1.0.2/angular.js:4160:23)
    at Object.$get.Scope.$digest (https://ajax.googleapis.com/ajax/libs/angularjs/1.0.2/angular.js:7693:38)
    at Object.$get.Scope.$apply (https://ajax.googleapis.com/ajax/libs/angularjs/1.0.2/angular.js:7894:24)
    at SNAKE_CASE_REGEXP (https://ajax.googleapis.com/ajax/libs/angularjs/1.0.2/angular.js:930:13)
    at Object.invoke (https://ajax.googleapis.com/ajax/libs/angularjs/1.0.2/angular.js:2788:25)
    at bootstrap (https://ajax.googleapis.com/ajax/libs/angularjs/1.0.2/angular.js:928:12)
    at angularInit (https://ajax.googleapis.com/ajax/libs/angularjs/1.0.2/angular.js:904:5)
    at https://ajax.googleapis.com/ajax/libs/angularjs/1.0.2/angular.js:14397:5 

转载于此fiddle

【问题讨论】:

    标签: unit-testing angularjs


    【解决方案1】:

    在你的指令中你有:

    scope: {
       bar: '='
    }
    

    这意味着它将在指令元素 (&lt;div foo&gt;&lt;/div&gt;) 上查找属性名称“bar”,并在指令和为属性指定的对象中进行双向数据绑定。所以,首先你需要添加一个bar 属性,然后你需要在你的范围内设置一些属性值的名称。见http://jsfiddle.net/u4BTu/6/

    【讨论】:

    • 除了一次注释掉一行并刷新之外,你怎么知道它抱怨的是哪个范围元素?它没有在此错误的错误消息中说明。只有整体指令名称。 OP 的例子很明显,但是如果它发生在一个有很多绑定的指令上呢?
    • @JoshRibakoff 一种方法是在 Angular 代码中抛出一个断点并检查变量以查看它在 nodeLinkFn 中寻找的参数 - 具体而言,definition 变量应该包含有用的信息。
    【解决方案2】:

    此错误的另一个可能原因是忽略了 Angular 的 normalization 属性。例如,如果您有以下指令:

    <my-directive parameter-one="foo" parameter_two="bar"></my-directive>
    

    使用此范围声明:

    scope: {
      'parameter-one': '=',
      parameter_two: '=',
    }
    

    你会得到这个错误。要更正,请使用范围声明的规范化版本:

    scope: {
      parameterOne: '=',
      parameterTwo: '=',
    }
    

    【讨论】:

      猜你喜欢
      • 2013-04-24
      • 2021-08-04
      • 2014-10-26
      • 1970-01-01
      • 2021-06-09
      • 2017-03-10
      • 2017-04-14
      • 1970-01-01
      • 2017-08-12
      相关资源
      最近更新 更多