标签: knockout-mapping-plugin

Knockout.js ko.mapping.toJS在我的视图中没有刷新数据

我从服务器获取一个json对象并填充我的视图.然后我更改数据,将其推回服务器.然后我获取数据的新副本,希望它会刷新我的视图并进行任何更改.然而,这不会发生.TIA

$(document).ready(function() {
    var customer_id = get_customer_id();
    var data = load_model();
    contract_model = ko.mapping.fromJS(data,{});
    ko.applyBindings(contract_model);
}

function load_model(){
    var url = '/ar/contract_json?contract_id='+get_contract_id();
    var data = '';
    $.ajax({
        type:'GET',
        url:url,
        async:false,
        success: function(returningValue){
            data = returningValue;
        }
    });
    return data;
}
Run Code Online (Sandbox Code Playgroud)

这个初始加载工作正常.然后我做了一些事情并更改了一个observable并将数据推送回服务器.服务器获取更新,然后我重新获取数据,以便视图将刷新(我知道我可以一步传回新数据,但这在代码中我还没有重构).

function refresh_data(contract_model){
    var url = '/ar/contract_json?contract_id='+get_contract_id();
    $.post(url,function(data){
        console.log(data);
        ko.mapping.fromJS(contract_model,{},data);
        ko.applyBindings(contract_model);
        console.log(ko.mapping.toJS(contract_model))
    });

}

function refresh_data(contract_model){
    var url = '/ar/contract_json?contract_id='+get_contract_id();
    $.post(url,function(data){
        console.log(data);
        ko.mapping.fromJS(contract_model,{},data);
        console.log(ko.mapping.toJS(contract_model))
    });

}

function push_model(contract_model,refresh){
    var url = '/ar/update_contract';
    var data = {'contract':ko.mapping.toJSON(contract_model)}

    delete data['lines'];
    $.post(url,data,function(return_value){
        if …
Run Code Online (Sandbox Code Playgroud)

javascript knockout-mapping-plugin knockout.js

6
推荐指数
1
解决办法
7595
查看次数

KnockoutJS:使用映射更新/插入数据到viewModel

我一直试图解决这个问题很长一段时间了.我找不到任何解决这个问题的方法,但如果我错了请纠正我.

问题:我有来自JSON API的数据,有嵌套的数组/对象结构.我使用映射来初始用我的数据填充模型.为了更新这个,我希望在新数据到达时扩展模型,或者更新现有数据.

据我所知,映射选项键应该为我做这个技巧,但我可能误解了映射选项的功能.

我已经把这个例子代表的问题归结为:

var userMapping = {
    key: function(item) {
        return ko.utils.unwrapObservable(item.id);
    }
};

// JSON call replaced with values
var viewModel = {
    users: ko.mapping.fromJS([], userMapping)
};

// Should insert new - new ID?
ko.mapping.fromJS([{"id":1,"name":"Foo"}, {"id":2,"name":"Bar"}], userMapping, viewModel.users);

// Should only update ID#1 - same ID?
ko.mapping.fromJS([{"id":1,"name":"Bat"}], userMapping, viewModel.users);

// Should insert new - New ID?
ko.mapping.fromJS([{"id":3,"name":"New"}, {"id":4,"name":"New"}], userMapping, viewModel.users);

ko.applyBindings(viewModel);?
Run Code Online (Sandbox Code Playgroud)

小提琴:http://jsfiddle.net/mikaelbr/gDjA7/

如您所见,第一行插入数据.都好.但是当我尝试更新时,它会替换内容.第三个映射相同; 它取代了内容,而不是扩展它.

我用错了吗?我应该在使用映射之前尝试"手动"扩展内容吗?

编辑解决方案:
我通过使用存储所有当前模型的第二个辅助数组解决了这种情况.在新数据上,我扩展了这个数组,并更新了视图模型以包含累积的项目.

在更新(在我的情况下,WebSocket的消息),我通过模型环,有关更改的项目内容,以及使用的方法valueHasMutated()得到改变的值淘汰赛LIB的通知.

javascript knockout-mapping-plugin knockout.js

6
推荐指数
1
解决办法
3548
查看次数

Knockout.js和复选框列表:发布到mvc控制器

我有一个MVC视图模型,如下所示:

public class DirectorySearchModel
{
    [Display(Name = "First name contains")]
    public string FirstName { get; set; }

    [Display(Name = "Last name contains")]
    public string LastName { get; set; }

    public CountriesCollection Countries { get; set; }
    public IEnumerable<Country> SelectedCountries { get; set; }
    public IEnumerable<Country> AllCountries { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

CountriesCollection对象(第9行)如下所示:

public class CountriesCollection
{
    [Display(Name = "Countries")]
    public int[] arrCountries { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

现在,我正在创建一个新的,空白的CountriesCollection实例,然后将其添加到DirectorySearchModel视图模型的空白实例中,然后将其全部序列化为Knockout.js的javascript视图模型:

{
"FirstName":null,

"LastName":null,

"Countries":{"arrCountries":[]},

"SelectedCountries":[{"RelationshipManager":{},"CountryId":1,"CountryName":"UK"},{"RelationshipManager":{},"CountryId":2,"CountryName":"France"},{"RelationshipManager":{},"CountryId":3,"CountryName":"Spain"}],

"AllCountries":[{"RelationshipManager":{},"CountryId":1,"CountryName":"UK"},{"RelationshipManager":{},"CountryId":2,"CountryName":"France"},{"RelationshipManager":{},"CountryId":3,"CountryName":"Spain"}]
}
Run Code Online (Sandbox Code Playgroud)

我的复选框呈现为:<input checked="checked" data-bind="checked: Countries.arrCountries" …

asp.net-mvc asp.net-mvc-3 asp.net-mvc-2 knockout-mapping-plugin knockout.js

6
推荐指数
1
解决办法
2489
查看次数

Knockout Mapping - fromJS - 失败了一个简单的例子

我试图弄清楚我对Knockout的映射库有什么误解.我已经将它简化为一个简单的例子,并且仍然可以通过fromJS调用使其失败(而不是使用映射的变量更新).

在这个例子中,我从根本上犯了什么错误?

// Here's my view model
var ViewModel = function() {
    this.firstName = ko.observable('first');
    this.lastName = ko.observable('last');
};

var myVM = new ViewModel();

ko.applyBindings(myVM); // Apply to Knockout (works)

myVM.lastName('maiden name'); // Test an update (works)

var newData = {firstName: 'new', lastName: 'person'};

// Try update the ViewModel
ko.mapping.fromJS(newData, myVM); //(No update, or error)

// Intended result - UI updates to 'new person'
Run Code Online (Sandbox Code Playgroud)

和相应的观点:

<div class='liveExample' >   
    <p>First name: <input data-bind='value: firstName' /></p> 
    <p>Last name: <input data-bind='value: …
Run Code Online (Sandbox Code Playgroud)

javascript knockout-mapping-plugin knockout.js

6
推荐指数
2
解决办法
9709
查看次数

如何在knockout可观察数组中创建对象属性是可观察的?

当在挖掘映射中使用'create'选项时,我们将使数组成为可观察的数组.但是,我们如何使可观察数组中每个对象的属性成为可观察的?

在这个来自淘汰文档的例子中,children数组是一个可观察的数组,但是我想让每个对象文字中的所有元素如id,name也是一个可观察的元素.我们如何实现这一目标.只需ko.observable在创建块中放置每个新创建的对象?

var data = {
    name: 'Graham',
    children: [
        { id : 1, name : 'Lisa' }
    ]
};

// Your custom data model
var myChildModel = function (data) {
    this.id = data.id;
    this.name = data.name;
};

var mapping = {
    'children': {
        create: function(options) {
            return new myChildModel(options.data);
        }
    }
};

var viewModel = ko.mapping.fromJS(data, mapping);
Run Code Online (Sandbox Code Playgroud)

knockout-mapping-plugin knockout.js

6
推荐指数
1
解决办法
2万
查看次数

敲除映射插件中的奇怪内存泄漏

无法弄清楚为什么在使用knockout.mapping插件创建视图模型的情况下,处理计算的observable不会从全局变量中删除订阅.
首先让我们看看直接创建模型时会发生什么:

// Global variable.
var Environment = {
    currencyStr: ko.observable("usd.")
};
// Item model, used intensively.
function ItemModel(price) {
    var self = this;
        
    this.price = ko.computed(function () {
        // Computed is subscribed to global variable.
        return price + ' ' + Environment.currencyStr();
    });
};

ItemModel.prototype.dispose = function () {
    // Dispoing subscription to global variable.
    this.price.dispose();
};

function ViewModel() {
    var self = this;
    
    self.items = ko.observableArray([]);
    // Simply adds 1000 new items to observable array directly.
    self.addItems = …
Run Code Online (Sandbox Code Playgroud)

javascript knockout-mapping-plugin knockout.js

6
推荐指数
1
解决办法
705
查看次数

Knockout组列表包含对象的较小列表

我有多个员工的每日数据,并且根据可能意味着大量数据的开始时间和结束时间.

因此,使用映射插件,我将它们映射到一个大的列表,但我需要将它们按员工分组到较小的列表中,这样我就可以为每个员工制作一个表(如较小的视图模型),该表对该数据子集进行过滤和排序.

这是我用静态数据创建的基本示例.

$(function () {
    var data = {
        Employees: [{
            Id: 1,
            Name: "Employee1",
            Day: new Date(),
            Price: 12.54
        }, {
            Id: 2,
            Name: "Employee2",
            Day: new Date(),
            Price: 112.54
        }, {
            Id: 1,
            Name: "Employee1",
            Day: new Date(),
            Price: 12.54
        }, {
            Id: 3,
            Name: "Employee3",
            Day: new Date(),
            Price: 12.54
        }]
    };

    // simulate the model to json conversion. from now on i work with the json
    var jsonModel = JSON.stringify(data);

    function employeeModel(data) {
        var employeeMapping …
Run Code Online (Sandbox Code Playgroud)

.net javascript asp.net-mvc knockout-mapping-plugin knockout.js

6
推荐指数
1
解决办法
1116
查看次数

如何使用knockout mapping插件添加新项目

我正在尝试淘汰映射样本,并认为我几乎就在那里.我似乎无法在viewModel.foos中添加新的Foo - 有谁能看到我在这里错过的内容?

var Foo = function (data) {

    var self = this;
    self.id = data.id;
    self.Name = ko.observable(data.Name);

}

var dataMappingOptions = {
    key: function(data) {
        return data.id;        
    },
    create: function (options) {

        return new Foo(options.data);
    }
};


var viewModel = {

    foos: ko.mapping.fromJS([]),
    loadInitialData: function () {
        ko.mapping.fromJS(serverData, dataMappingOptions, viewModel.foos);
    },
    loadUpdatedData: function () {
        ko.mapping.fromJS(serverData, dataMappingOptions, viewModel.foos);
    }
};

viewModel.addFoo = function () {
    viewModel.foos.push(ko.mapping.fromJS(new Foo()));
    viewModel.loadUpdatedData();
}


    <ul data-bind="template: {name: 'TopTemplate'}"></ul>
<script type="text/html" id="TopTemplate">
    <li><span>Result</span>
        <ul …
Run Code Online (Sandbox Code Playgroud)

knockout-mapping-plugin knockout.js

5
推荐指数
2
解决办法
6499
查看次数

淘汰映射JSON更新现有视图模型

我有来自服务器的这个JSON数据:

{"HaveNotification":false,"IsError":false,"Title":null,"Description":null}
Run Code Online (Sandbox Code Playgroud)

并尝试通过ko.mapping填充此视图模型:

var notifyVM = {
  HaveNotification: ko.observable(true),
  IsError: ko.observable(false), 
  Title: ko.observable('Title goes here'), 
  Description: ko.observable('Description goes here'), 
}
Run Code Online (Sandbox Code Playgroud)

使用此代码,在轮询间隔调用该代码:

function pollNotifications() {

  $.getJSON('@Url.Action("GetNotifications", "Home")', function (data) {

    ko.mapping.fromJSON(data, notifyVM);

    setTimeout(pollNotifications, 10000);
  });
}
Run Code Online (Sandbox Code Playgroud)

这是页面加载代码:

$(function () {

  ko.applyBindings(notifyVM);

  setTimeout(pollNotifications, 10000);
});
Run Code Online (Sandbox Code Playgroud)

但它不起作用.如果我在fromJSON调用之后检查视图模型,则不会更新observable,它们仍处于初始值.

更新:更多信息......如果我在pollNotifications函数中执行此操作

var newVM = ko.mapping.fromJSON(data);
Run Code Online (Sandbox Code Playgroud)

我注意到它创建的视图模型与我的视图模型不同,它由一个可观察的函数组成,而我的是一个具有一组可观察属性的对象.

jquery knockout-mapping-plugin knockout.js

5
推荐指数
2
解决办法
2664
查看次数

Knockout添加到数组的数组

我正在寻找一种方法来使用knockout和knockout mapping将项添加到属于另一个数组中的项的数组.

我有以下,一个Person,它有一个WorkItems数组,有一个ActionPlans数组.Person> WorkItems> ActionPlans

淘汰赛代码如下 -

var PersonViewModel = function(data) {
var self = this;
ko.mapping.fromJS(data, trainingCourseItemMapping, self);

self.addWorkItem = function() {
    var WorkItem = new WorkItemVM({
        Id: null,
        JobSkillsAndExpDdl: "",
        JobSkillsAndExperience: "",
        ActionPlans: ko.observableArray(),
        PersonId: data.Id
        })
   self.WorkItems.push(WorkItem)
};

self.addActionPlan = function () {
    var actionPlan = new ActionPlanVM({
        Id: null,
        priorityAreaStage: "",
        goal: "",
        action: "",
        byWho: "",
        byWhen: ""
        WorkItemId: data.Id
    });
    self.ActionPlans.push(actionPlan);
};
}
Run Code Online (Sandbox Code Playgroud)

数组映射

var trainingCourseItemMapping = {
'WorkItem': {
    key: function(workitem) {
        return …
Run Code Online (Sandbox Code Playgroud)

javascript asp.net-mvc knockout-mapping-plugin knockout-2.0 knockout.js

5
推荐指数
1
解决办法
120
查看次数