如何在松散耦合的淘汰对象中设置值

时间:2015-11-07 15:33:54

标签: javascript knockout.js loose-coupling

我有两个对象项目和设置我想要结合。 这适用于呈现数据。但是,当我想设置数据时(在这种情况下带有复选框),视图仅在第一次单击时响应。这是我的代码的简化版本:

Settings = function (data) {
    var self = this;

    self.settingsID = data.settingsID;
    self.projectID = data.projectID;
    self.isVisible = ko.observable(data.isVisible || true);
    return self;
}

Project = function (data) {
    var self = this;
    self.projectID = data.projectID;   
    return self;
}

关键是projectID

我定义了以下函数(在多个视图模型中重用):

my = {
    utils : {}
};
my.utils.getSettings = function (projectid, settings){
    return ko.computed(function () {
        return ko.utils.arrayFirst(settings(), function (s) {
            return s.projectID === projectid;
        });
    });
};

在我的viewModel中,关系定义如下:

ViewModel = function  (meID) {
    self.selectedProject = ko.observable();

    // some code setting the value of 'self.selectedProject'…

    // settings 
    self.Settings = ko.observableArray();
    $.ajax({
        url: "/myService/GetSettingsByUserId",
        data: "userID=" + meID,
        dataType: 'json',
        success: function (allData) {
            self.Settings($.map(allData, function (item) {
                return new Settings(item);
            }));
        }
    });
    self.getSettings = function (data) { return my.utils.getSettings(data.projectID, self.Settings) };
};

在我看来,我得到了这个HTML:

<div  data-bind="with: selectedProject">
    <div class="checkbox">
        <label>
            <input type="checkbox" data-bind="checked: $root.getSettings($data)().isVisible" />
            <label>is Visible</label>
         </label>
    </div>
</div>

为什么第一次获得复选框更新? 我想这是因为无法通过&#39; my.utils.getSettings&#39;来更新Setting-object,但为什么呢? 我哪里出错了?

0 个答案:

没有答案