Ошибка: выражение, не подлежащее назначению: undefined - программирование
Подтвердить что ты не робот

Ошибка: выражение, не подлежащее назначению: undefined

Я пытаюсь написать тесты для директивы, поэтому я создаю ее вручную с помощью $compile. (Да, я знаю, что для этого могу использовать тесты e2e, но в этом случае я хочу протестировать некоторую независимую логику DOM, поэтому я использую подход unit test.)

У меня есть поле, с которым я привязываюсь к 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.

4b9b3361

Ответ 1

В вашей директиве вы:

scope: {
   bar: '='
}

Это означает, что он будет искать элемент директивы (<div foo></div>) для имени атрибута "bar" и выполнять двустороннюю привязку данных в вашей директиве и объект, указанный для атрибута. Итак, сначала вам нужно добавить атрибут bar, а затем вам нужно что-то установить в своей области с именем значения атрибута. См. http://jsfiddle.net/u4BTu/6/

Ответ 2

Другой возможной причиной этой ошибки является игнорирование атрибутов Angular normalization. Например, если у вас есть следующая директива:

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

С объявлением этой области:

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

Вы получите эту ошибку. Чтобы исправить, используйте нормализованные версии для объявления области видимости:

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