忍受我,因为这对我来说很困难。我有一个对象,我们从数据库中提取数字作为键:
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]; }
这是解决这个问题的正确方法吗?我遇到的主要问题是:
我得到"错误:达到10 $ digest()次迭代。中止&#34!;错误。基于我在SO上阅读的内容,我不确定如何将定义移出函数?
我正在解决"实体"在控制器之前的UI路由器中的属性。但是,BookService直到我传入它之后才会得到这个。因此,对于每个函数,我是否需要发送实体属性?例如,将函数更改为:
function getAuthor(entity) { return entity[23]; }
我仍然是有角度的初学者,所以希望这是有道理的。如果需要进一步澄清,请告诉我们!
答案 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)
不确定我应该如何将定义移出函数?
要获得“功能不合适”的内容,请使用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成为可能。