2012-06-14 1 views
0

Я начал использовать knockout.js, и мне это очень нравится. Я использую ASP.NET MVC, JQuery и knockout.jsknockou.js получает модель от сопоставления сервера с картографическим плагином и отправкой модели назад

Мой вопрос заключается в следующем: позволяет сказать, что у меня есть экран управления пользователя, пользователь мой взгляд модель внутри пользователя я хочу массив разрешений

мой ViewModel пользователь:

var userViewModelClass = function() { 
    var self = this; 
    ko.mapping.fromJS({ 
     ID: "", 
     permissions: [] 
    }, {}, self); 
} 

сейчас .. если я делать Ajax запрос на сервер и получить JSON назад я пользователь отображение плагин, и все идет как ожидалось

но ... теперь я хочу, чтобы в моем списке разрешенных прав было такое действие, как удаление. , поэтому мне понадобится объект разрешения, а затем массив разрешений будет массивом объектов разрешений. но как это сделать? как будет отображение плагин знать, что объект возвращается к нему с сервера в массиве фактически на объекте, как этот:

function permission() { 
    var self = this; 
    this.delete = function() {  
    }; 
    ko.mapping.fromJS({ 
     name: "", 
     level: "" 
    }, {}, self); 
} 

, что моя первая часть вопроса. Вторая часть: позволяет сказать, что я получил модель с массивом всех разрешений, и все они являются объектом этого разрешения. теперь я хочу, чтобы каждая кнопка удаления в моем представлении связывала функцию удаления внутри объекта разрешения. с помощью:

data-bind="click: delete" 

что является лучшей реализацией для функции удаления? я подумал о чем-то вроде: сделать ajax-вызов на сервер, который фактически удалит разрешение от пользователя. то, если вызов удалит текущее разрешение из наблюдаемого массива, тогда представление будет обновляться ... - это хорошая практика?

спасибо!

ответ

1

Первая часть. Вам нужно использовать параметры сопоставления. В вашем userViewModelClass сделайте это.

var userViewModelClass = function() { 
    var self = this; 
    ko.mapping.fromJS({ 
     ID: "", 
     permissions: [] 
    }, { 
     permissions: { 
      create: function(options) { 
       return new permission(options.data); 
      } 
     } 
    }, self); 
} 

и изменить объект разрешения, как так

function permission(config) { 
    var self = this; 
    this.delete = function() {  
    }; 
    ko.mapping.fromJS($.extend({ 
     name: "", 
     level: "" 
    }, config), {}, self); 
} 

Примечание я добавил расширить, так чтобы ваша структура по умолчанию сохраняется и будет перезаписана входящими данными.

Вторая часть вашего вопроса. Один из возможных способов - передать ссылку на родителя в свой конструктор. Таким образом, вышеуказанные варианты сопоставления станут

permissions: { 
    create: function(options) { 
     return new permission(options.data, self); 
    } 
} 

Тогда ваше удаление может быть чем-то вроде.

this.delete = function() { 
    $.ajax(deleteurl, yourdata, function(result) { 
     // success 
     parent.permissions.remove(self); 
    }, function() { 
     // failure 
     display error message 
    }  
}; 

РЕДАКТИРОВАТЬ

Альтернативный способ, как описано в комментарии.

var userViewModelClass = function() { 
    var self = this; 
    ko.mapping.fromJS({ 
     ID: "", 
     permissions: [] 
    }, { 
     permissions: { 
      create: function(options) { 
       return new permission(options.data); 
      } 
     } 
    }, self); 

    this.delete = function(permission) { 
     self.permissions.remove(permission); 
    }; 
} 

data-bind="click: $parent.delete" 

Надеюсь, что это поможет.

+0

спасибо, что вы очень скоро попробуете и вернетесь сюда :), Я понимаю первую часть, и она выглядит красиво. но мне не понравилась вторая часть .. подумайте об этом, у вас есть объект, содержащий объект, а второй объект будет иметь ссылку на своего отца? .. и тогда у вас есть эта строка: parent.permissions.remove (self); вы переходите к родителям, затем в коллекцию, в которой вы находитесь, а затем удаляете себя. кажется странным для меня .. я понимаю, что он будет работать, но его все еще странно. Я думаю, что его недостающие события –

+1

Я просто показывал вам способ сделать это с помощью простого js, как вы его выложили. На мой взгляд, удаление должно фактически быть членом родителя, а не дочерним. Таким образом, ваш метод удаления должен находиться в классе userViewModel. События осложняют ситуацию в этом тривиальном сценарии. – madcapnmckay

+0

большое спасибо! не знал об этом: $ parent.delete yup this, конечно, ответит на мой вопрос, а также отлично выглядит. благодаря –

 Смежные вопросы

  • Нет связанных вопросов^_^