Нокаут не может обработать привязку — не определено

#knockout.js

#knockout.js

Вопрос:

Я унаследовал проект с использованием нокаута ^3.1.0 . Мне нужно создать некоторые функции. Я никогда не использовал нокаут.

У каждого представления есть модель представления, которая вызывается из основной модели представления с init(model) помощью .

Свойства инициализируются в начале инициализации и используются в представлении без проблем. Например:

 model.entities = ko.observableArray([]);
model.hasEntities = ko.observable(false);
  

Инициализируются как таковые и используются без ошибок в привязке без контейнеров, подобной этой:

 <!-- ko if: hasEntities -->
<!-- ko foreach: { data: entities, as: 'entity' } -->
  

Поэтому я инициализирую свои новые свойства в том же месте / способом:

   model.numberOfColumns = ko.observable(2);

  model.columnGenerator = ko.computed(function() {
    return ko.utils.range(0, model.numberOfColumns());
  }, model);
  

и использовать его как таковой:

 <!-- ko foreach: { data: columnGenerator, as: 'index' } -->
  

и получите эту ошибку:

knockout.js:72 Неперехваченная ошибка ссылки: невозможно обработать привязку «foreach: function (){return { data:columnGenerator,как:’index’} }» Сообщение: генератор столбцов не определен

Я искал МНОГО вопросов, связанных с этой ошибкой, и ни один из них не помог.

Спасибо!

Комментарии:

1. Опубликовать полное сообщение об ошибке

2. готово (необходимо ввести 11 символов, чтобы опубликовать комментарий)

3. Вероятно, потому <!-- ko foreach: { data: columnGenerator, as: 'index' } --> , что находится в другой области , чем $root . Попробуйте { data: $root.columnGenerator, as: 'index' } или включите полную соответствующую часть HTML.

4. Да, так что я пробовал это несколько раз ранее и получил еще одну ошибку. Я просто сделал это, чтобы опубликовать ошибку, и все заработало. Так странно. Возможно, это было что-то еще, что я исправил. Отправьте это как ответ, и я приму его. Спасибо

Ответ №1:

Это потому, что ваш

 <!-- ko foreach: { data: columnGenerator, as: 'index' } -->
  

Интерпретируется в области, отличной от $root области (где columnGenerator определено).

Попробуйте это вместо:

 <!-- ko foreach: { data: $root.columnGenerator, as: 'index' } -->
  

См. Раздел Привязка-Контекст

Комментарии:

1. Я думаю, мой единственный вопрос: «Почему другие привязки работают без $root. префикса?»

2. @MayNotBe, потому что, если вы не меняете область, ваша область — это $root область. Если вы добавите больше своего HTML-кода, мы сможем увидеть, почему / когда ваша область меняется (возможно, из-за with или foreach ).

3. Да, это имеет смысл. Спасибо!

4. Просто понял, что причина, по которой он не работал, заключалась в том, что я не очищал кеш браузера. SMH