From 5753f1486e3d438a548e4facb1fd53c54f957d91 Mon Sep 17 00:00:00 2001 From: Francois Zaninotto Date: Tue, 14 Apr 2015 20:47:17 +0200 Subject: [PATCH] Prevent an infinite digest loop error --- README.md | 22 +++++----- examples/blog/config.js | 41 ++++++------------- examples/blog/stub-server.json | 25 ++++++++--- .../Crud/fieldView/ChoiceFieldView.js | 2 +- 4 files changed, 45 insertions(+), 45 deletions(-) diff --git a/README.md b/README.md index 0cdebf6c..cd55baee 100644 --- a/README.md +++ b/README.md @@ -419,21 +419,21 @@ Define array of choices for `choice` type. { value: 'FR', label: 'France' }, { value: 'US', label: 'USA' }, ]); + var cities = [ + { country: 'FR', value: 'Paris', label: 'Paris' }, + { country: 'FR', value: 'Nancy', label: 'Nancy' }, + { country: 'US', value: 'NY', label: 'New York' }, + { country: 'US', value: 'SF', label: 'San Francisco' } + ] nga.field('city', 'choice') .choices(function(entry) { - if (entry.values.country == 'FR') { - return [ - { value: 'Paris', label: 'Paris' }, - { value: 'Nancy', label: 'Nancy' } - ]; - if (entry.values.country == 'US') { - return [ - { value: 'NY', label: 'New York' }, - { value: 'SF', label: 'San Francisco' } - ]; - } + return cities.filter(function (city) { + return city.country === entry.values.country + }); }); + *Tip*: When using a function for choice values, if you meet the "Uncaught Error: [$rootScope:infdig] 10 $digest() iterations reached. Aborting!", that's because the `choices()` function returns a new array every time. That's a known AngularJS limitation (see the [infinite digest loop documentation](https://docs.angularjs.org/error/$rootScope/infdig)). + ### `date` Field Settings * `format(string ['yyyy-MM-dd' by default])` diff --git a/examples/blog/config.js b/examples/blog/config.js index fe577928..c20422f8 100644 --- a/examples/blog/config.js +++ b/examples/blog/config.js @@ -93,40 +93,25 @@ nga.field('published_at', 'date') // Date field type translates to a datepicker ]); - var categories = [{ - label : 'Tech', - value : 'tech' - },{ - label : 'Lifestyle', - value : 'lifestyle' - }]; - var subCategories = [{ - label : 'Computers', - value : 'computers', - category : 'tech' - }, { - label : 'Gadgets', - value : 'gadgets', - category : 'tech' - },{ - label : 'Travel', - value : 'travel', - category : 'lifestyle' - }, { - label : 'Fitness', - value : 'fitness', - category : 'lifestyle' - }]; + var subCategories = [ + { category: 'tech', label: 'Computers', value: 'computers' }, + { category: 'tech', label: 'Gadgets', value: 'gadgets' }, + { category: 'lifestyle', label: 'Travel', value: 'travel' }, + { category: 'lifestyle', label: 'Fitness', value: 'fitness' } + ]; post.editionView() .title('Edit post "{{ entry.values.title }}"') // title() accepts a template string, which has access to the entry .actions(['list', 'show', 'delete']) // choose which buttons appear in the top action bar. Show is disabled by default .fields([ post.creationView().fields(), // fields() without arguments returns the list of fields. That way you can reuse fields from another view to avoid repetition - nga.field('category', 'choice') - .choices(categories), - nga.field('subCategory', 'choice') - .choices(function(entry){ + nga.field('category', 'choice') // a choice field is rendered as a dropdown in the edition view + .choices([ // List the choice as object literals + { label: 'Tech', value: 'tech' }, + { label: 'Lifestyle', value: 'lifestyle' } + ]), + nga.field('subcategory', 'choice') + .choices(function(entry) { // choices also accepts a function to return a list of choices based on the current entry return subCategories.filter(function (c) { return c.category === entry.values.category }); diff --git a/examples/blog/stub-server.json b/examples/blog/stub-server.json index 10eaa7ec..e96ca095 100644 --- a/examples/blog/stub-server.json +++ b/examples/blog/stub-server.json @@ -12,10 +12,19 @@ "url": "http://www.photo-libre.fr/paysage/1.jpg", "metas": { "title": "This is a great photo", - "definitions": ["72", "300"], + "definitions": [ + "72", + "300" + ], "authors": [ - { "name": "Paul", "email": "paul@email.com" }, - { "name": "Joe", "email": "joe@email.com" } + { + "name": "Paul", + "email": "paul@email.com" + }, + { + "name": "Joe", + "email": "joe@email.com" + } ] } }, @@ -139,7 +148,10 @@ "tags": [ 4, 3 - ] + ], + "category": "tech", + "subcategory": "computers", + "pictures": null }, { "id": 12, @@ -148,7 +160,10 @@ "body": "

Praesentium corrupti minus molestias eveniet mollitia. Sit dolores est tenetur eos veritatis. Vero aut molestias provident ducimus odit optio.

Minima amet accusantium dolores et. Iste eos necessitatibus iure provident rerum repellendus reiciendis eos. Voluptate dolorem dolore aliquid sed maiores.

Ut quia excepturi quidem quidem. Cupiditate qui est rerum praesentium consequatur ad. Minima rem et est. Ut odio nostrum fugit laborum. Quis vitae occaecati tenetur earum non architecto.

Minima est nobis accusamus sunt explicabo fuga. Ut ut ut officia labore ratione animi saepe et.

Accusamus quae ex rerum est eos nesciunt et. Nemo nam consequatur earum necessitatibus et. Eum corporis corporis quia at nihil consectetur accusamus. Ea eveniet et culpa maxime.

Et et quisquam odio sapiente. Voluptas ducimus beatae ratione et soluta esse ut animi. Ipsa architecto veritatis cumque in.

Voluptatem dolore sint aliquam excepturi. Pariatur quisquam a eum. Aut et sit quis et dolorem omnis. Molestias id cupiditate error ab.

Odio ut deleniti incidunt vel dolores eligendi. Nemo aut commodi accusamus alias reprehenderit dolorum eaque. Iure fugit quis occaecati aspernatur tempora iste.

Omnis repellat et sequi numquam accusantium doloribus eum totam. Ab assumenda facere qui voluptate. Temporibus non ipsa officia. Corrupti omnis ut dolores velit aliquam ut omnis consequuntur.

Et et non dolores itaque nesciunt reiciendis fuga quod. Quia voluptate repellat consequatur cupiditate et sint quis.

Quidem est nihil odit deleniti ab. Perspiciatis odit modi et aut et dolor.

Architecto velit et ipsam deserunt. Nostrum non fuga voluptatibus dolore rerum. Vitae consequuntur qui dolor laborum.

Atque iusto neque voluptatem aut neque. Necessitatibus at quas consectetur rerum ipsum. Et ullam aut velit.

Ad et nobis voluptatem et voluptatem cum facilis unde. Qui qui ratione dolores necessitatibus doloribus. Tempore aut consequatur ea optio. Eaque sunt recusandae expedita quaerat excepturi. Autem ipsum aliquid at porro perspiciatis.

Enim magni voluptatibus sunt et quos facilis recusandae id. Voluptatem autem exercitationem ut maxime eaque corporis aut. Vel quas accusamus voluptatem est odio. Officiis temporibus iusto corporis quos sed non qui.

Architecto aut assumenda assumenda doloremque enim et. Aut totam alias sint ipsa. Nihil aut alias pariatur minus aut eos ut.

Vitae aut velit illum natus. Animi error nemo veritatis natus. Vel nulla veniam consequatur consequatur laboriosam incidunt minima. Id rem accusamus voluptatum modi et aut et.

Excepturi corporis omnis ipsam ipsam praesentium ipsa. Voluptas qui deleniti iusto mollitia vitae sequi. Dicta vero et eveniet delectus asperiores voluptatum ratione. Distinctio porro sunt qui ea.

Dignissimos tempora atque quaerat doloribus repellendus molestias eveniet. Consectetur sunt adipisci voluptate enim in. Rerum non ut optio nam nostrum est. Tempora et nihil sit pariatur. Eius minima sit earum sed alias vero dolorem.

Dolor deleniti ipsum et odit in laboriosam repellat consequatur. Et ipsum tenetur ipsum ut debitis quo. Sunt inventore aut tenetur eum facilis qui adipisci. Praesentium rerum occaecati nulla.

Voluptatem dignissimos odio repudiandae. Id et ut ut id nisi. Occaecati omnis blanditiis temporibus nobis nesciunt corrupti.

Eligendi cumque alias blanditiis est. Eum aperiam dolore iste. Qui velit eos voluptas ea quidem. Quia natus pariatur doloremque velit accusamus.

Aliquid quidem assumenda autem fuga corporis rerum. Qui aut officia voluptatem voluptas maxime molestias. Nostrum ab quasi et blanditiis iusto esse.

Rem expedita non sequi. Itaque molestiae et non tempore corrupti ullam quisquam modi. Ex in maxime architecto consequuntur minima quaerat voluptatem. Omnis est eius accusantium et ipsum dolore.

Suscipit harum aut eveniet saepe reprehenderit. Ipsa eaque distinctio nulla nam libero. Debitis architecto quasi quia magnam quia.

Fugit dolorum illum aut molestiae neque. Delectus non voluptate vero est debitis id. Vitae distinctio iste omnis aspernatur voluptatem vero. Quaerat recusandae rem repellat.

Dolorum praesentium voluptas et omnis qui commodi laborum. Dolorem nostrum repellat facilis consectetur ex. Repudiandae iusto quia numquam. Reprehenderit sint beatae error non.

Recusandae in eius quos et voluptas. Doloremque consequuntur laudantium vel nihil. Eligendi quis aut ducimus numquam.

Doloribus ea maxime voluptatem sit. Et ullam quo rerum quia necessitatibus sed impedit.

Facilis quisquam et sunt. Eum officiis dolorem enim sapiente voluptatem sunt. Eum sit quidem culpa veniam sit.

Excepturi saepe alias ut rerum. Non autem hic dignissimos vel quo qui quas unde. Unde ut minus id architecto.

Eveniet ipsum et non error et nemo. Magnam voluptates dolore tenetur velit deserunt cupiditate ut. Voluptas rerum sed aut distinctio. Eligendi quis id molestiae.

Voluptatem adipisci et est voluptatibus repudiandae molestiae distinctio. Quisquam enim aliquid veritatis. Iure eos velit quod commodi fugit molestiae.

Consequuntur et velit quia et deserunt officia ut. Pariatur et atque ut nulla saepe cum veritatis. Qui praesentium praesentium quos consequatur.

", "views": 720, "published_at": "2012-11-07", - "tags": [] + "tags": [], + "category": "lifestyle", + "subcategory": "fitness", + "pictures": null } ], "comments": [ diff --git a/src/javascripts/ng-admin/Crud/fieldView/ChoiceFieldView.js b/src/javascripts/ng-admin/Crud/fieldView/ChoiceFieldView.js index 43cbab04..37e2bdb9 100644 --- a/src/javascripts/ng-admin/Crud/fieldView/ChoiceFieldView.js +++ b/src/javascripts/ng-admin/Crud/fieldView/ChoiceFieldView.js @@ -11,7 +11,7 @@ define(function(require) { return ''; } function getWriteWidget() { - return ''; + return ''; } return { getReadWidget: getReadWidget,