在durandal viewmodel中分离关注点时出现问题

时间:2014-07-08 17:32:12

标签: javascript requirejs durandal

经过大量的头发拉动和谷歌搜索后,我担心我会在一个基本上简单的问题上碰壁砖。

我试图将我的数据访问层从我的viewModel抽象为一个单独的require / js文件,并且遇到某种同步问题。以下是我演示我尝试的内容的实现。

// movieList.js viewmodel (paired with movieList.html [not shown in example])

define(function (require) {
    // i'd like to remove these declarations and un rem the moviesRepo line
    var http = require('../../durandal/http');
    var url = 'movies';

    //var moviesRepository = require("repositories/moviesRepositoryDB");

    var vm = {
        movies: ko.observable(),

        activate: function () {
            var that = this;
            // i'd like to remove the line below with the commented section
            return http.get(url).then(function (response) {
                that.movies(response.All);
            });
            //return this.movies(moviesRepository.listMovies());
        }
    };

    return vm;
})

这一切都运行正常,可以在firebug中观看数据并填充我的html视图 - 到目前为止一切顺利。现在到了问题出现的地方。如果我解开代码的注释部分并删除http.get部分,那么我的问题就会暴露出来。基本上,从 moviesRepositoryDB js文件调用相同的代码片段但由于某种原因(可能与syncronicity有关),它从不显示在页面上(尽管在firebug中显示成功获取json数据)。

以下是 moviesRepositoryDB 文件中的代码:

// moviesRepositoryDB.js -the abstracted data access layer

define(function (require) {
    // this slightly different path to http is correct
    var http = require('../durandal/http');

    var url = 'movies';

    return {

        movies: ko.observableArray([]),

        listMovies: function () {
            var that = this;
            return http.get(url).then(function (response) {
                that.movies(response.All);
            });
        },

    };
});

[edit] -static moviesRepository class (新问题是如何在不更改您提供的代码的情况下返回电影收藏集原来的问题: - ))

define(function (require) {

    return {
        movies: ko.observableArray([
            {Id: 0, Title: "Star Wars", Director: "Lucas"},
            {Id: 1, Title: "King Kong", Director: "Jackson"},
            {Id: 2, Title: "Memento", Director: "Nolan"}
        ]),

        listMovies: function () {
            return this.movies();
        }
    };
});

任何人都能发现我的职业生涯中明显的缺陷吗?这让我在过去的2-3个小时里盘旋了,它让我很紧张:-)。我知道我可以使用将数据访问与viewmodel代码结合起来的初始选项,但是,我希望能够交换数据访问层(db vs test code vs我需要的任何其他数据访问) )因此很想破解这个。

无论如何,不​​要急于 - 只要有任何明显的东西,我们将不胜感激......

1 个答案:

答案 0 :(得分:1)

查看moviesReposiotryDB.js示例电影正在填充到movicesRepositoryDB.movi​​es属性中,而不是从listMovies方法返回。您需要从listMovies方法返回电影或调用listMovies方法,并在履行承诺时从电影属性中获取电影。

可能像

var that = this; // we need to reference this as that inside the function
return moviesRepository.listMovies().then(function(){
  that.movies(moviesRepository.movies());
});