json-schema-form / angular-schema-form

Generate forms from a JSON schema, with AngularJS!
https://json-schema-form.github.io/angular-schema-form
MIT License
2.47k stars 653 forks source link

Form doesn't refresh when setting the schema and form to empty #806

Closed s-anes closed 7 years ago

s-anes commented 7 years ago

Enhancement

As a developer, when I clear out the schema and the form an empty form should be rendered.

Expected behaviour

The following renders a text box:

$scope.form= [
  "name"
];

$scope.schema={
"type": "object",
  "properties": {
    "name": {
      "title": "Name",
      "type": "string"
    }
  }
};

If I then want to change the schema and the form to:

$scope.form= [];

$scope.schema={
"type": "object",
  "properties": {
  }
};

I expected the text box to disappear and the page to be empty.

Actual behaviour

It actually keeps displaying the text box despite the schema and the form being empty.

I've using angular.copy in both the schema and form and then redraw as per comments in #395, #428 but no joy:

$scope.form = angular.copy(newForm);
$scope.schema.properties = angular.copy(newSchema.properties);
$scope.$broadcast('schemaFormRedraw');

If the schema isn't empty (has anything in properties), the form clears if empty. The problem is I want to have a schema and a form per panel, and if a panel is empty (no questions) the schema shouldn't have any properties.

Have I done something wrong or am I missing something? I'd appreciate if anyone could shed some light here.

Thanks!

@json-schema-form/angular-schema-form-lead

Anthropic commented 7 years ago

@s-a-85 try this:

$scope.form = ["*"];
$scope.schema = {
  "type": "object",
  "properties": {
    "blank":{}
  }
};

It only bothers to render if there is something to render, so it needs something in properties.

s-anes commented 7 years ago

Hi @Anthropic , Thanks for your reply. I had figured that out and even the following would do:

$scope.form = [];
$scope.schema = {
  "type": "object",
  "properties": {
    "blank":{}
  }
};

However, I would expect it to clear the form. I assume there is no way to force it to 'bother'? Thanks again.

Anthropic commented 7 years ago

@s-a-85 well I would just watch the schema and form objects and if they were empty I would hide the entire form myself. But if you think it should clear both then I am happy to mark the issue as an enhancement request?

SacSingh commented 7 years ago

I was having the same issue. Assigning the code below would not clear the pre-rendered form content.

$scope.Form = [];
$scope.Schema = []; 
$scope.$broadcast('schemaFormRedraw');

But now I've placed a conditional to check is $scope.From is empty and I'm calling the following code (provided by @Anthropic) to clear the previously rendered form.

$scope.form = [];
$scope.schema = {
  "type": "object",
  "properties": {
    "blank":{}
  }
};
s-anes commented 7 years ago

@Anthropic Sorry for the late response. A work around is fine. Happy to close this issue.

Anthropic commented 7 years ago

@s-a-85 thank you for your time :)