Angular 1中的预加载依赖承诺

时间:2017-06-15 20:06:57

标签: angularjs

忍受我,因为这对我来说很困难。我有一个对象,我们从数据库中提取数字作为键:

entity: {
23: "This is a definition of the string here",
34: "This is a string definition for 34 here",
55: ['array', 'here'],
...
}

让我们想象一下" 23" key是指作者的姓名和" 34"指出版商的名称等。我不想在每个控制器中手动映射出这些关系。因此,我认为进行映射的最佳位置是名为" BookService"的服务。

我首先在BookService中创建了一堆函数,如:

vm.getAuthor = function () {
   return vm.entity[23];
}
...

根据这个样式指南(https://github.com/johnpapa/angular-styleguide/blob/master/a1/README.md),我试着这样做:

vm.getAuthor = getAuthor;

function getAuthor() { return vm.entity[23]; }

这是解决这个问题的正确方法吗?我遇到的主要问题是:

  1. 我得到"错误:达到10 $ digest()次迭代。中止&#34!;错误。基于我在SO上阅读的内容,我不确定如何将定义移出函数?

  2. 我正在解决"实体"在控制器之前的UI路由器中的属性。但是,BookService直到我传入它之后才会得到这个。因此,对于每个函数,我是否需要发送实体属性?例如,将函数更改为:

    function getAuthor(entity) { return entity[23]; }
    
  3. 我仍然是有角度的初学者,所以希望这是有道理的。如果需要进一步澄清,请告诉我们!

2 个答案:

答案 0 :(得分:1)

似乎最好创建一个从提供的实体创建书籍的工厂:

angular.module('myapp')
.factory('BookFactory', BookFactory);

BookFactory.inject = [];
function BookFactory() {

  function newBook(entity) {
    return {
      author: entity[23],
      publisher: entity[54],
    };
  }

  return {
    newBook: newBook
  }
}

这样,如果该映射发生变化,您只需要编辑这一个函数。

在您的控制器中,您可以创建一个新的图书对象:

var myBook = BookFactory.newBook(entity);
console.log(myBook.author); // this will work

就您的错误而言,我们需要了解更多信息,以了解您收到该错误的原因。这是一个非常模糊的错误,你的书籍对象的结构不太可能与它有任何关系。

答案 1 :(得分:1)

Angular 1中的预加载依赖承诺

  

不确定我应该如何将定义移出函数?

要获得“功能不合适”的内容,请使用return statement

对于promise的.then方法,“从函数中获取”的是一个新的promise,它将解析为返回的内容。因此可以chain promises

  $routeProvider
   .when('/Book/:bookId', {
    templateUrl: 'book.html',
    controller: 'BookController',
    resolve: {
       book: function($routeParams, BookService) {
           var bookId = $routeParams.bookId;
           var bookPromise = BookService.getBook(bookId);
           var finalPromise = bookPromise.then( function(book) {
               var authorPromise = BookService.getAuthor(book.authorId);
               var nestedPromise = authorPromise.then( function(author) {
                   book.author = author;
                   return book;
               });
               return nestedPromise;
           });
           return finalPromise;
       })
    }
  })

resolve函数执行两次服务调用,第一次使用bookID查找书籍,第二次使用第一次服务调用返回的authorId查找作者。解析程序将已解析的author属性添加到book对象。链式承诺解析为book对象,其author属性设置为作者字符串。

  

Chaining Promises

     

因为调用promise的.then方法会返回一个新的派生promise,所以很容易创建一个promise链。

     

可以创建任意长度的链,并且由于可以使用另一个承诺(将进一步推迟其解析)来解决承诺,因此可以在链中的任何点暂停/推迟承诺的解析。这使得实现强大的API成为可能。

     

— AngularJS $q Service API Reference - Chaining Promises