[Representation] Refresh only capabilities on modified

When changes to a domain object's modification timestamp are
detected, refresh only the capabilities associated with that
domain object (instead of rebuilding the whole view.)
Specifically avoids latency when layout views are rebuilt,
WTD-716.
This commit is contained in:
Victor Woeltjen 2015-01-27 10:00:06 -08:00
parent 5c34382933
commit 0df809741a
2 changed files with 35 additions and 22 deletions

View File

@ -57,6 +57,34 @@ define(
return new Representer($scope, element, attrs);
});
// Populate scope with any capabilities indicated by the
// representation's extension definition
function refreshCapabilities() {
var representation = representationMap[$scope.key],
domainObject = $scope.domainObject,
uses = ((representation || {}).uses || []);
if (domainObject) {
// Update model
$scope.model = domainObject.getModel();
// Provide any of the capabilities requested
uses.forEach(function (used) {
$log.debug([
"Requesting capability ",
used,
" for representation ",
$scope.key
].join(""));
$q.when(
domainObject.useCapability(used)
).then(function (c) {
$scope[used] = c;
});
});
}
}
// General-purpose refresh mechanism; should set up the scope
// as appropriate for current representation key and
// domain object.
@ -88,29 +116,14 @@ define(
// Populate scope with fields associated with the current
// domain object (if one has been passed in)
if (domainObject) {
// Always provide the model, as "model"
$scope.model = domainObject.getModel();
// Initialize any capabilities
refreshCapabilities();
// Also provide the view configuration,
// for the specific view
$scope.configuration =
($scope.model.configuration || {})[$scope.key] || {};
// Also provide any of the capabilities requested
uses.forEach(function (used) {
$log.debug([
"Requesting capability ",
used,
" for representation ",
$scope.key
].join(""));
$q.when(
domainObject.useCapability(used)
).then(function (c) {
$scope[used] = c;
});
});
// Finally, wire up any additional behavior (such as
// gestures) associated with this representation.
activeRepresenters.forEach(function (representer) {
@ -130,7 +143,7 @@ define(
// Finally, also update when there is a new version of that
// same domain object; these changes should be tracked in the
// model's "modified" field, by the mutation capability.
$scope.$watch("domainObject.getModel().modified", refresh);
$scope.$watch("domainObject.getModel().modified", refreshCapabilities);
// Do one initial refresh, so that we don't need another
// digest iteration just to populate the scope. Failure to

View File

@ -115,7 +115,7 @@ define(
mockScope.key = "abc";
// Trigger the watch
mockScope.$watch.mostRecentCall.args[1]();
mockScope.$watch.calls[0].args[1]();
expect(mockScope.inclusion).toEqual("a/b/c/template.html");
});
@ -126,7 +126,7 @@ define(
mockScope.key = "xyz";
// Trigger the watch
mockScope.$watch.mostRecentCall.args[1]();
mockScope.$watch.calls[0].args[1]();
expect(mockScope.inclusion).toEqual("x/y/z/template.html");
});
@ -138,7 +138,7 @@ define(
mockScope.domainObject = mockDomainObject;
// Trigger the watch
mockScope.$watch.mostRecentCall.args[1]();
mockScope.$watch.calls[0].args[1]();
expect(mockDomainObject.useCapability)
.toHaveBeenCalledWith("testCapability");
@ -155,7 +155,7 @@ define(
expect(mockLog.warn).not.toHaveBeenCalled();
// Trigger the watch
mockScope.$watch.mostRecentCall.args[1]();
mockScope.$watch.calls[0].args[1]();
// Should have gotten a warning - that's an unknown key
expect(mockLog.warn).toHaveBeenCalled();