Использование Knockout.js с новейшими файлами jQuery и ASP.NET MVC - PullRequest
12 голосов
/ 26 октября 2010

Я пытаюсь использовать Knockout.js с ASP.NET MVC 3.0 (Название выдало его, не так ли?!)

http://knockout.js.com

Я сталкиваюсь с некоторымипроблемы (больше связанные с новым движком jQuery Tmpl, чем ASP.NET MVC 3.0).

В своем тесте я использую примерную программу Стива Сандерсона, и в основном реплицировал его результаты с новымRazor View Engine (я не верю, что Razor имеет какое-либо отношение к моей проблеме).

http://blog.stevensanderson.com/2010/07/12/editing-a-variable-length-list-knockout-style/

Однако я хочу сделать больше с привязкой natural jqueryвместо атрибутов привязки HTML.Это подробно описано в руководстве по нокауту.http://knockoutjs.com/documentation/template-binding.html

Однако я не могу воспроизвести это, как это объясняется.Я покажу ниже моего View Code.Моя проблема связана с тем, что {{foreach (i, gift) gifts}} не работает.Я перепробовал много вариантов ({{foreach (i, gift) gifts()}}, как я видел в других примерах).

Я использую последний knockout.js файл.Я использую jQuery 1.4.3. Я использую http://ajax.microsoft.com/ajax/jquery.templates/beta1/jquery.tmpl.js для шаблонизатора.Тем не менее, я также попробовал это, используя тот же файл tmpl.js, который есть на сайте knockous.js, и я получаю те же результаты.

При использовании шаблонов jQuery, согласно текущей спецификации, шаблон не отображается.

Документация по тегам шаблонов jQuery находится здесь: http://api.jquery.com/category/plugins/templates/template-tags/

На случай, если кто-нибудь запутается в моей точной модели.Если я заменю {{foreach (i, gift) gifts}} на {{foreach gift}}, то модель будет отображаться и вести себя правильно, но я не могу использовать декларации jQuery ${property} для чего-либо.

HTML

@model IEnumerable<Knockout.GiftModel>
@using System.Web.Script.Serialization;

@{
    View.Title = "Index";
    Layout = "~/Views/Shared/_Site.cshtml";
}

    <h2>Gift list editor</h2>

    <form class="giftListEditor" action="/home/index" method="post" >
        <table> 
            <tbody data-bind="template:'giftRowTemplate'"></tbody> 
        </table>

        <button data-bind="click: addGift">Add Gift</button>
        <button data-bind="enable: gifts().length > 0" type="submit">Submit</button>
    </form>

    <script type="text/html" id="giftRowTemplate">
        {{each (i, gift) gifts}}
        <tr> 
            <td>Gift name: <input class="required" data-bind="value: Title, uniqueName: true" /> ${Title} </td> 
            <td>Price: $ <input class="required number" data-bind="value: Price, uniqueName: true"/></td> 
            <td><a href="#" data-bind="click: function() { viewModel.removeGift( $value ) }">Delete</a></td> 
        </tr>
        {{/each}}
    </script>

    <script type="text/javascript">
        var initialData = @(new HtmlString(Model.ToJson()));
        var viewModel = {
            gifts: ko.observableArray(initialData),
            addGift: function () {
                this.gifts.push({ Title: "", Price: "" });
            },

            removeGift: function (gift) {
                this.gifts.remove(gift);
            },

            save: function () {
                ko.utils.postJson(location.href, { gifts: this.gifts });
            }
        };

        ko.applyBindings(viewModel);
        $("form").validate({ submitHandler: function() { viewModel.save() } });
    </script>

Ответы [ 2 ]

9 голосов
/ 27 октября 2010

Я бы подошел к этому иначе.Я бы использовал следующую строку:

<tbody data-bind='template: { name: "giftRowTemplate", foreach: gifts }'></tbody>

вместо:

<tbody data-bind="template:'giftRowTemplate'"></tbody>

Таким образом, вам не нужно использовать строку {{each (i, gift) gifts}} в шаблоне, который доставляет вам проблемы.

0 голосов
/ 04 марта 2012

{{each gifts}} вместо {{each (i, gift) gifts}} добьется цели.

...