Как следить за функцией на предмет изменений в Angular/breeze?

Со следующим кодом:

$scope.hasChanges = datacontext.manager.hasChanges;

Я пытаюсь дать некоторое представление о том, есть ли какие-либо изменения в текущем контексте бриза для включения/отключения некоторых кнопок:

<button ng-disabled="!hasChanges" class="btn btn-warning cancel" ng-click="cancel()">Cancel</button>

Это работает, если я устанавливаю true/false в представлении, но если я пытаюсь вызвать hasChanges или haschanges(), кнопки всегда отключены.

Я также пробовал это:

 $scope.$watch(datacontext.manager.hasChanges, function () {
    $scope.hasChanges = datacontext.manager.hasChanges;
});

но безрезультатно.

Как я могу узнать вид, когда есть изменения в бризе hasChanges? В нокауте я бы просто использовал наблюдаемую... Интересно, что я здесь делаю неправильно.


person RobVious    schedule 08.08.2013    source источник


Ответы (2)


Проблема с $scope.hasChanges = datacontext.manager.hasChanges; связана с классическим JavaScript. Вы видите функцию (hasChanges), которая была оторвана от объекта-владельца (manager).

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

$scope.isCancelDisabled = function () {return !datacontext.manager.hasChanges();};

Затем напишите свой html следующим образом:

<button ng-disabled="isCancelDisabled()" ... ng-click="cancel()">Cancel</button>

Конечно, это будет часто вызывать datacontext.manager.hasChanges(). Это довольно быстро, но вы будете вызывать его примерно дважды за каждый цикл дайджеста. Если (и я имею в виду «ЕСЛИ») вы обнаружите с помощью измерений, что это слишком медленно для вашего экрана (опять же, я сказал «ЕСЛИ»)… вы можете превратить cancelDisabled в поле виртуальной машины и установить его, слушая hasChangesChanged как предложил Джей. Я не уверен, что стал бы заморачиваться.

person Ward    schedule 09.08.2013

Breeze EntityManager имеет событие hasChangesChanged, на которое вы можете подписаться. Что-то вроде:

myEntityManager.hasChangesChanged.subscribe(function(args) {
    var hasChanges = args.hasChanges;
    var entityManager = args.entityManager;
    ... do something interesting...
});

EntityManager также имеет событие EntityChanged, которое может быть полезным.

См. также: документацию API EntityManager.

person Jay Traband    schedule 08.08.2013
comment
Спасибо, Джей. Я немного в растерянности (новичок в Breeze) - если у вас есть время, как мне связать это с угловым кодом/представлением? - person RobVious; 08.08.2013