Windows Azure + DevExrpess (PhoneJs) получение ToDoList (стандартный пример)

Я начинаю изучать и лазурный phonejs. Todo list получить через стандартный пример:

$(function() {
var client = new WindowsAzure.MobileServiceClient('https://zaburrito.azure-mobile.net/', 'key');
var todoItemTable = client.getTable('todoitem');

// Read current data and rebuild UI.
// If you plan to generate complex UIs like this, consider using a JavaScript templating library.
function refreshTodoItems() {
    var query = todoItemTable.where({ complete: false });

    query.read().then(function(todoItems) {
        var listItems = $.map(todoItems, function(item) {
            return $('<li>')
                .attr('data-todoitem-id', item.id)
                .append($('<button class="item-delete">Delete</button>'))
                .append($('<input type="checkbox" class="item-complete">').prop('checked', item.complete))
                .append($('<div>').append($('<input class="item-text">').val(item.text)));
        });

        $('#todo-items').empty().append(listItems).toggle(listItems.length > 0);
        $('#summary').html('<strong>' + todoItems.length + '</strong> item(s)');
    }, handleError);
}

function handleError(error) {
    var text = error + (error.request ? ' - ' + error.request.status : '');
    $('#errorlog').append($('<li>').text(text));
}

function getTodoItemId(formElement) {
    return $(formElement).closest('li').attr('data-todoitem-id');
}

// Handle insert
$('#add-item').submit(function(evt) {
    var textbox = $('#new-item-text'),
        itemText = textbox.val();
    if (itemText !== '') {
        todoItemTable.insert({ text: itemText, complete: false }).then(refreshTodoItems, handleError);
    }
    textbox.val('').focus();
    evt.preventDefault();
});

// Handle update
$(document.body).on('change', '.item-text', function() {
    var newText = $(this).val();
    todoItemTable.update({ id: getTodoItemId(this), text: newText }).then(null, handleError);
});

$(document.body).on('change', '.item-complete', function() {
    var isComplete = $(this).prop('checked');
    todoItemTable.update({ id: getTodoItemId(this), complete: isComplete }).then(refreshTodoItems, handleError);
});

// Handle delete
$(document.body).on('click', '.item-delete', function () {
    todoItemTable.del({ id: getTodoItemId(this) }).then(refreshTodoItems, handleError);
});

// On initial load, start by fetching the current data
refreshTodoItems();

});

и это работает! Поменял на использование phonejs и программа перестает работать, даже ошибок не выдает!

Это мой взгляд:

<div data-options="dxView : { name: 'home', title: 'Home' } " >
<div class="home-view"  data-options="dxContent : { targetPlaceholder: 'content' } " >
    <button data-bind="click: incrementClickCounter">Click me</button>
    <span data-bind="text: listData"></span>
    <div data-bind="dxList:{
            dataSource: listData,
            itemTemplate:'toDoItemTemplate'}">
        <div data-options="dxTemplate:{ name:'toDoItemTemplate' }">
            <div style="float:left; width:100%;">
                <h1 data-bind="text: name"></h1>
            </div>
        </div>
    </div>
</div>

This my ViewModel:

Application1.home = function (params) {
var client = new WindowsAzure.MobileServiceClient('https://zaburrito.azure-mobile.net/', 'key');
var todoItemTable = client.getTable('todoitem');

var toDoArray = ko.observableArray([
    { name: "111", type: "111" },
    { name: "222", type: "222" }]);

var query = todoItemTable.where({ complete: false });
query.read().then(function (todoItems) {
    for (var i = 0; i < todoItems.length; i++) {
        toDoArray.push({ name: todoItems[i].text, type: "NEW!" });
    }
});

var viewModel = {
    listData: toDoArray,
    incrementClickCounter: function () {
        todoItemTable = client.getTable('todoitem');
        toDoArray.push({ name: "Zippy", type: "Unknown" });
    }
};

return viewModel;

};

Я легко добавляю элементы в список программ, но из списка серверов не приходит :-( Я доведен до изнеможения и уже 3 дня не могу решить проблему, что для меня критично! Укажите где моя ошибка!Спасибо!


person Alexey    schedule 18.03.2015    source источник


Ответы (1)


Я предлагаю вам использовать DevExpress.data.DataSource и DevExpress.data.CustomStore вместо ko.observableArray.

Application1.home = function (params) {
    var client = new WindowsAzure.MobileServiceClient('https://zaburrito.azure-mobile.net/', 'key');
    var todoItemTable = client.getTable('todoitem');

    var toDoArray = [];        
    var store = new DevExpress.data.CustomStore({
      load: function(loadOptions) {
        var d = $.Deferred();
        if(toDoArray.length) {
            d.resolve(toDoArray);
        } else { 
           todoItemTable
               .where({ complete: false })
               .read()
               .then(function(todoItems) {
                   for (var i = 0; i < todoItems.length; i++) {
                       toDoArray.push({ name: todoItems[i].text, type: "NEW!" });
                   }
                   d.resolve(toDoArray);
               });
        }
        return d.promise();
      },

      insert: function(values) {
        return toDoArray.push(values) - 1;
      },

      remove: function(key) {
        if (!(key in toDoArray))
          throw Error("Unknown key");

        toDoArray.splice(key, 1);
      },

      update: function(key, values) {
        if (!(key in toDoArray))
          throw Error("Unknown key");
        toDoArray[key] = $.extend(true, toDoArray[key], values);
      }
    });

    var source = new DevExpress.data.DataSource(store);
    // older version
    store.modified.add(function() { source.load(); });
    // starting from 14.2:
    // store.on("modified", function() { source.load(); });

    var viewModel = {
        listData: source,
        incrementClickCounter: function () {
            store.insert({ name: "Zippy", type: "Unknown" });
        }
    };

    return viewModel;

}

Подробнее об этом можно прочитать здесь и здесь.

person seteh    schedule 18.03.2015
comment
у меня не работает. Список не отображается, а элемент добавляется, вы только что написали весь код? - person Alexey; 18.03.2015
comment
Этот список не реагирует на изменение данных. Как изменить View для отображения данных? - person Alexey; 18.03.2015
comment
Я только что сделал для вас образец, смотрите: jsfiddle.net/Seteh/b1wnnjew посмотрите на использование класса DevExpress.data.DataSource и на событие modified store. - person seteh; 18.03.2015
comment
Большое спасибо за Вашу помощь. Но у меня это не работает с Azure и PhoneJs, вот мой проект yadi.sk/d/kyuKCHkpfLtJ2 Прошу посмотреть в чем проблема, проект VS 2013 - person Alexey; 18.03.2015
comment
@Алексей, пожалуйста. Вы используете старую версию PhoneJS, поэтому в интерфейсе CustomStore нет метода on. Я обновил свой ответ. Надеюсь, поможет. - person seteh; 18.03.2015