Существует ли стандартный способ работы с JavaScript, используемый только в одном представлении в MVC? - PullRequest
3 голосов
/ 23 июня 2011

Я впервые пробовал MVC.Я использую Code Igniter для MVC вместе с jQuery и jQueryUI для внешнего интерфейса.У меня есть основная идея MVC, и у меня есть рабочий сайт.Концептуально, однако, я хочу убедиться, что я остаюсь максимально жестким в отношении идеи MVC.

У меня есть основной вид обложки, а затем используется load->view("skin", $contents), где $contents - ассоциативный массив, содержащийдругие представления.

В результате у меня есть одна страница (называемая "консоль администратора"), на которой вызывается представление скина, а $content содержит больше HTML.Я хочу, чтобы диалоговое окно jQueryUI использовалось только на этой странице.Чтобы создать это, у меня есть тег <script>, который содержит диалоговое окно javascript в представлении консоли администратора.Это заканчивается тегом <script> в середине набора HTML, который включает в себя, когда отображается последняя страница.

Конечным результатом этого является то, что я лениво загружаю JavaScript, но это может привести кнесколько вызовов jQuery $(document).ready(function(){...});.

У меня все работает, но я не уверен, соответствует ли моя реализация принципам MVC.Лучше ли использовать метод, который я использую, в котором javascript загружается только тогда, когда он используется, или я должен положить javascript где-нибудь еще?Я делаю горы из холмов?


Мой соответствующий код контроллера:

function index(){
$tree = $this->mainModel->getUnitTreeMeta();
$treeOutput = $this->load->view('unit_tree', array('units' => $tree), TRUE);
$pages = $this->mainModel->getPages();

$console = $this->load->view('admin_console', array('units'=>$tree, 'pages'=>$pages), TRUE);

$content = array(
    'title'         =>  'Admin Console',
    'css'           =>  link_tag(array('href' => 'css/admin.css', 'rel' => 'stylesheet', 'type' => 'text/css', 'media'=> 'screen'))."\n",
    'navbar'        =>  'navbar',
    'content'       =>  $console,
    'rightSidebar'  =>  $treeOutput,
    'footer'        =>  ''
);

$this->load->view('skin', $content);
}

skin.php содержит строку <?=$content?>, которая является HTML / JS, содержащимся впредставление admin_console:

<div>
    <div>
        ...
        <a href="" id="addUnit" class="smallLinks">Add a New Unit</a>
    </div>
</div>

<!-- DIALOG BOXES -->
<div id="addUnitDialog" title="Add A New Unit">
    <?php echo form_open('admin/add_unit'); ?>
    Unit Name: <br />
    <?php echo form_input("unitName", "");?>
    <br />
    Content: <br />
    <?php echo form_textarea("content", "");?>
    <?php echo  form_close();?>
    <div id="addUnitResponse"></div>
</div>

<script type="text/javascript">
    $(document).ready(function(){
        $( "#addUnitDialog" ).dialog({
            autoOpen: false,
            minWidth: 680,
            buttons: {
                "add Unit" : function(){
                    var unitName = $("input", this).val();
                    var content = $("textarea", this).val();

                    $.ajax({
                        url : "add_unit",
                        type : "POST",
                        success :function(){
                            location.reload();
                        },
                        error : function(){
                            $("#addUnitResponse").text("error");
                        }
                    });
                }
            }           
        });
        $("a#addUnit").click(function(){
            $( "#addUnitDialog" ).dialog( "open" );
            return false;       
        });
    });
</script>

1 Ответ

1 голос
/ 23 июня 2011

Лично я отступил от своего мнения, что JS никогда не должен появляться в HTML. Но, как обычно я делаю, это включаю блок "if(isset(..." в представления:

// You may choose to have non-array implementations...
if(isset($js_array))
{
    foreach($js_array as $file)
    {
        if(strpos($file, '.'))
             echo "<script type=\"text/javascript\" src=\"$file\" />" . PHP_EOL;
        else
             echo "<script type=\"text/javascript\">$file</script>" . PHP_EOL;
    }
}

Недостатком здесь является то, что элемент управления должен знать, как представление отображает разные вещи. Конечно, это можно исправить, создав файл admin.php с двумя строками:

 $js_array = array('/custom_js.js');
 require_once('skin.php'); //<-- will cause issues if your server does not 
                           //    allow short tags, but CodeIgniter is parsing 
                           //    them for you. (I find that bad anyway...)

Вам нужно позвонить $this->load->view('admin', $content);, но это небольшое изменение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...