AngularJS: принудительное обновление собственных одноразовых привязок

Есть ли способ принудительно обновить одноразовое привязку (собственные одноразовые привязки, присутствующие в v1.3 + not BindOnce library) без необходимости перекомпилировать весь DOM node (что является

Здесь я хочу, чтобы содержимое span обновлялось до текущего значения $scope.firstname.

То, как я представляю себе, как это будет сделано, - это использовать директиву refresh-on, которая заставляет обновление, когда оно принимает событие "firstNameUpdated".

Ответы

Ответ 1

Бесстыдная реклама здесь для чего-то, над чем я возился.

angular-bind-notifier

Какой для вашего случая использования будет выглядеть так:

<span bind-notifier="{fName:firstName}" ng-bind=":fName:firstName"></span>

Где fName - eventKey, а firstName - наблюдаемое выражение.

Он работает как kcd-recompile (основная идея такая же), но с некоторыми основными отличиями;

  • Я подключаюсь к сервису $parse, чтобы не перекомпилировать весь DOM node.
  • Поддержка нескольких выражений key:val для восстановления.

Со всем сказанным я не вижу огромного выигрыша в этом для единственного boundValue.

Было бы лучше (imho) запустить обычный {{}} для одного значения. Вы просто торгуете одним $watch для другого здесь, kcd-recompile и bind-notifier только когда-либо действительно сияет ярко, когда у вас есть несколько значений для обновления.

Ответ 2

Мне пришлось это делать, потому что я использовал angular -datatables, и я не хотел, чтобы таблица данных постоянно обновлялась каждый раз, когда карусель с 5-секундным таймером менял изображения на нем. Но я также хотел иметь возможность обновлять таблицу при определенных обстоятельствах.

То, что я сделал, было обертывание всей datatable в ng-if = "data", и я установил одноразовые привязки ко всем ng-повторам в таблице (у меня было более одного. Один для динамического набора столбцов, один для строк).

Затем, когда я хочу обновить таблицу, я делаю это сначала:

$timeout(function(){
    $scope.$apply(function(){
        $scope.data = null;
    });
});
//Put code to set $scope.data to a new value here

Это удаляет всю таблицу из dom до ее повторного создания. Когда он будет заново создан, одноразовые привязки будут повторно привязываться. Это немного дорого, но это работает.

Так что ваш ответ. Если вы удалите раздел html с однократной привязкой из DOM с ng-if, а затем верните его обратно, он будет повторно привязан к новому значению.