9

我创建了一个小例子来尝试让多个模型在没有 Ember Data 的情况下工作。

App = Ember.Application.create();

App.Router.map(function () {
    this.resource('employees', function () {
        this.route('employee');
    });
});

App.Employee = Ember.Object.extend({});

App.Employee.reopenClass({
    findAll: function () {
        return $.getJSON("http://localhost/api/employee").then(
            function (response) {
                var employees = [];
                response.forEach(function (child) {
                    employees.push(App.Employee.create(child));
                });
                console.log(employees.join('\n'));
                return employees;
            }
        );
    }
});

App.EmployeesController = Ember.ArrayController.extend({});

App.EmployeesRoute = Ember.Route.extend({
    model: function () {
        return App.Employee.findAll();
    }
});

车把:

<script type="text/x-handlebars">
    <p>Application template</p>
    {{#linkTo employees}}<button>Show employees</button>{{/linkTo}}
    {{outlet}}
</script>

<script type="text/x-handlebars" data-template-name="employees">
    <p>Employees template</p>
    {{#each controller}}
    <p>{{Name}}</p>
    {{/each}}
    {{outlet}}
</script>

当我直接导航到localhost/#/employeeurl 时,它工作得很好,但是当我单击“显示员工”按钮时,我收到以下错误:

Uncaught TypeError: Object #<Object> has no method 'addArrayObserver' 

我可能在某处遗漏了一些东西,但我不确定错误指的是哪个对象。当我按下按钮时,我的模型钩子被正确调用,就像我通过手动输入 url 进行导航一样,所以我不明白在提到的两种情况下到底有什么不同。

4

1 回答 1

10

终于让这件事起作用了。

我的错误是尝试重新创建(阅读复制粘贴)Evil Trout 的示例,即在没有 Ember Data 的情况下执行 Ember 应用程序,并且对底层概念的理解不够好。

我的findAll方法返回了一个 Promise 对象,尽管控制器需要一个数组,因此Uncaught TypeError. 你需要做的是返回一个空ArrayProxy的,一旦收到 JSON 响应就会被填充。

App.Employee.reopenClass({
    findAll: function () {
        var employees = Ember.ArrayProxy.create({ content: [] });
        $.getJSON("http://localhost:49441/api/employee").then(
            function (response) {
                response.forEach(function (child) {
                    employees.pushObject(App.Employee.create(child));
                });
            }
        );
        return employees;
    }
});

如果您使用此方法正确返回了一个数组,则不必显式指定控制器是ArrayController.

现在我知道我做错了什么,我的问题有点愚蠢,但希望它可以帮助其他人入门。

于 2013-04-16T12:41:48.380 回答